2016-08-24 11 views
2

ファイルに対して実行している4つの異なるsedコマンドがあります。そして、これらの4つのコマンドのパフォーマンスを調整するために、私はそれらを1つにまとめる必要があります。 各コマンドは、-Eスイッチを使用した複雑なコマンドです。多くのフォーラムを検索しましたが、私の特定の答えを得ることができませんでした。複数のsedコマンドを1つに結合する方法

sed -i -E ':a; s/('"$search_str"'X*)[^X&]/\1X/; ta' "$newfile" 
sed -i -E '/[<]ExtData[>?" "]/{:a; /Name=/{/Name="'"$nvp_list_ORed"'"/!b}; /Value=/bb; n; ba; :b; s/(Value="X*)[^X"]/\1X/; tb; }' "$newfile" 
sed -i -E ':a; s/('"$search_str1"'X*)[^X\<]/\1X/; ta' "$newfile" 
sed -i -E ':a; s/('"$search_str2"'X*)[^X\/]/\1X/; ta' "$newfile" 

と私は、彼らが言う組み合わせたい何か

のようなSED -i -E 'Command1を' -e 'コマンド2' -e 'COMMAND3' -e 'command4' "$のNEWFILE"

しかし、動作しません。 -Eと-eを組み合わせることはできないためです。

お知らせください。

ありがとうございます! Puneet

+1

Mac OSXまたは他のBSDシステムを使用している場合、 '-i'には引数が必要です。 'sed -i '" -E -e' command1 '-e' command2 '-e' command3 '-e' command4 '"$ newfile" ' – John1024

+0

' -E'は '-r '? –

+0

@MadPhysicist最新のGNU sed(バージョン4.2.1以降)では、 '-r'と' -E'は同義語です。BSDでは '-E'だけが動作します。噂では、POSIXは '-E'を標準にしています。 – John1024

答えて

3

-Eは、「拡張正規表現」を意味し、スタンドアロンのフラグであり、-eは「表現」を意味し、sed表現が続く必要があります。
あなたはそれらを組み合わせることができますが、それぞれのsed式の前には-eの式を付ける必要があります。最初のものではありません。

sed -i -E -e 'command1' -e 'command2' -e 'command3' -e 'command4' "$newfile" 

2番目のオプションは、同じ式で各コマンドを記述することです:

sed -i -E 'command1;command2;command3;command4' "$newfile" 

をしかし、あなたはラベルを使用しているので、私は、このオプションに依存しないでしょう。一部の実装では、John1024が指摘されているため、サポートしていない場合があります。

最後に、Mad Physicistのように、sedという表現をファイルに書き込んで、-fオプションで参照してください。
ファイルには、行ごとに1つのsed式が含まれている必要があります(各行に接尾辞を付けて末尾に\を付けることで改行をエスケープすることができます)。

+0

第3の選択肢として、すべてをスクリプトに入れる。 –

+0

BSD sedは、ラベルと組み合わされたときに ';'をサポートしないかもしれません。 OPはラベルを使用しています。 – John1024

+0

ありがとう@アーロンあなたの最初のオプションは私のために魅力のように働いた! –

2

単にパイプそれら:

sed -E 'A' file | sed -E 'B' | ... >file.tmp && mv file.tmp file 
+0

中間の一時ファイルの必要性がなくなりますが、1つのコマンドですべてを行うのと同じくらい最適な方法ではないでしょう。とにかく+1。 –

+0

@ John1024。いいですよ。私は答えが単語 "パイプ"に基づいて '||'の代わりに '|'を意味したと思います。そして、はい、 '-i'フラグを削除する必要があります。それまでは、この答えはナンセンスです。 –

+0

あなたのコメントをありがとう、構文を修正しました。とにかく、@アロンの答えはより多くの演奏者です。 –

2

@Aaronが観察したように、sedに複数の別々の式を指定する場合は、それらを-eオプションとして指定する必要があります。それらは組み合わされます。また、セミコロンで区切って複数の式を1つにまとめることもできます。

あなたのケースは少し特殊ですが、特定の式ではラベルと分岐命令が使用され、ラベル名の1つ(a)が各式で繰り返されます。これらを組み合わせるには、各ラベルを区別し、各ブランチ(条件付きと絶対)のいずれかが正しいラベルを指定する必要があります。でも、適切にあなたが持っているように見えるシェルperspsectiveから引用して、あなたのアプローチは、補間されたシェル変数のいずれかの値ならば、あなたが期待して何をしないことに注意してください

sed -i -E \ 
    -e ':a1; s/('"$search_str"'X*)[^X&]/\1X/; ta1' \ 
    -e '/[<]ExtData[>?" "]/ {:a2; /Name=/ {/Name="'"$nvp_list_ORed"'"/ !b}; /Value=/ bb2; n; ba2; :b2; s/(Value="X*)[^X"]/\1X/; tb2; }' \ 
    -e ':a3; s/('"$search_str1"'X*)[^X\<]/\1X/; ta3' \ 
    -e ':a4; s/('"$search_str2"'X*)[^X\/]/\1X/; ta4' \ 
    "$newfile" 

:それはこのようになります正規表現のメタキャラクターが含まれています。

+1

例がいいでしょう。 –

+0

@Aaron、申し訳ありませんが、私はそこにうんざりしていました。修正されました。 –

+0

例が追加されました。 –

関連する問題