sed - 複数の連続置換を実行しますが、ファイルを一度だけ処理する方法は何ですか?

sed - 複数の連続置換を実行しますが、ファイルを一度だけ処理する方法は何ですか?

たとえば、連続交換が必要な複数の交換を実行する場合

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/' t1_spec.rb
sed -i '/expect(browser.*\.should/s/\.should/).should/' t1_spec.rb
sed -i 's/\.should/\.to/' t1_spec.rb 
sed -i 's/==/eq/' t1_spec.rb 

t1_spec.fileを1回だけ繰り返し、ファイルを4回繰り返すのではなく、1行に4回の置換を実行するより良い方法はありますか?

答え1

セミコロンを使用することに加えて、flagsを使用してsedに複数の式を提供できます-e

sed -i -e 's/expr1/replace1/' -e 's/expr2/replace2/'  t1_spec.rb 

答え2

セミコロンを使用して、一重引用符間の異なる代替文字を区別できます。

sed -i 's/foo/bar/;s/abc/def/' t1_spec.rb

-fまたは、これらすべてのコマンドをファイルに入れてくださいsed

sed -i -f my_sed_commands t1_spec.rb

このファイルは、同じコマンドセットを引き続き使用する場合にsed特に便利です。私はかつて汚れたデータフィードを処理しなければなりませんmassage.sedでした。

答え3

GNU(私のUbuntuシステムなど)では、単に複数行を使用することがサポートされており、これは複数の置換を意味すると推論されます。たとえば、非常に長い行を避けるため、うまく機能し、ビューにもよく見えます(IMHO)。

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/
        /expect(browser.*\.should/s/\.should/).should/
        s/\.should/\.to/
        s/==/eq/' t1_spec.rb 

関連情報