2016-07-01 2 views
1

ハイフンとそれに続く空白で構成されるすべての文字列を削除する必要がありますが、空白に続けて "og"という単語がない場合に限ります。 サンプルファイル:sedを使用して単語に続く文字列を照合する方法

Kultur- og idrettsavdelinga skapar nyska- pande kunst og utvik- lar samfunnet 

は、私は否定先読みを試してみました:

sed -e 's/- (?!og)//g' 

が、それは動作しません。私が欲しいのは次のようなものです:

Kultur- og idrettsavdelinga skapar nyskapande kunst og utviklar samfunnet. 

アイデアはありますか?

+0

AFAIK、 'sed'はlookaheadsとlookbehindsをサポートしていません。** [source](http://stackoverflow.com/questions/12176026/whats-wrong-with-my-lookahead-regex-in- gnu-sed)**あなたの代わりに 'perl'を使うことができます – rock321987

答えて

1

:上記

$ sed 's/a/aA/g; s/- og/aB/g; s/- eller/aC/g; s/- //g; s/aC/- eller/g; s/aB/- og/g; s/aA/a/g' file 
Kultur- og idrettsavdelinga skapar- eller nyskapande kunst og utviklar- eller samfunnet 

$ cat file 
Kultur- og idrettsavdelinga skapar- eller nyska- pande kunst og utvik- lar- eller samfunnet 

は、ここでは一般的なsedの慣用的なアプローチですa(または対象の文字列にない他の任意の文字)をaAに変換することで動作しますので、関心のある文字列- og- ellerを0123に変換することができます、例えば、 aBaCとその時点で我々は、入力中aBaCの唯一の出現は、新たに既存のa Sの全て以来- og- ellerを形質転換されたを知っては今aAです。

今、私たちは単にファイルから残りのすべての- Sを削除することができ、その後aCが戻っ- ellerにSとaBは元a sのバック- og sであり、最終的にはすべてのaA sで変換します。これは、(GNU SED)あなたのために働くかもしれない

+1

ありがとうEd! –

1

先読み機能は、sedを使用できませんが、あなたはすべての可能性を記述することができます。

sed -e 's/\(- \(- \)*\)\([^o]\|$\|o\([^g]\|$\)\)/\3/g' 

あなたがでそれをテストすることができます:- - - - og - - oa - o =>- og oa o

+0

' 'og'(" and "in Norwegian)では動作しますが、おそらく' 'or ''同様に... – Kusalananda

+0

あなたはそれについて正しいです!私は "eller"を探す必要があります。 –

1

あなたはまた、sedのチェーンを使用することができます、最初に- ogを無意味なもの(booogaboogaなど)に置き換え、次に置換を実行してからbooogaboogaを元に戻します。

sed -e 's/- og/booogabooga/g; s/- //g; s/booogabooga/- og/g' 

一部のバージョンではが必要になることがありsedを:

sed -e 's/- og/booogabooga/g' -e 's/- //g' -e 's/booogabooga/- og/g' 

これは@Kusalanandaが示唆するように、あなたが複数の置換を持っている場合は特に、遅く、より多くの痛みを伴うことができますが、理解しやすいです。この入力ファイル(あなたはあまりにもそれらを処理する必要があるコメントで述べているので、私は- eller秒を追加しました)を考えると

+0

これはうまくいった!ブリリアント!どうもありがとう! –

+1

安全で慣用的なアプローチは、入力には存在しない文字列を作成し、それを推測することではありません。 http://stackoverflow.com/a/38153467/1745001を参照してください。 –

+1

@EdMorton true。私がGoogleになった今、私はちょうど作ったと思った "booogabooga"(https://www.google.com/search?q=%22booogabooga%22)の信じられないほどの結果[174件]があります。 – Jedi

1

sed -r 's/(- (og|eller))|- /\1/g' file 

これは再代わる具体的な事例や一般的なケースを交換するために、空の後方参照に交互に依存しています。

関連する問題