sedを使用してファイルの複数行をコメントアウトする方法

sedを使用してファイルの複数行をコメントアウトする方法

ファイルに次の行があります

foo
bar
xxx
yyy
zzz

xxx、yyy、zzz 行をコメントアウトする必要があります。だから私は走る次のコマンド:

sed -e '/xxx/ s/^#*/#/' -i file
sed -e '/yyy/ s/^#*/#/' -i file
sed -e '/zzz/ s/^#*/#/' -i file

出る

foo
bar
#xxx
#yyy
#zzz

ループでこれを行うにはどうすればよいですか?

ありがとう

PD:このコマンド行番号を知ると役に立ちますが、違うかもしれないのでよくわかりません。

sed -e '2s/^/#/' -e '5s/^/#/' -e '7s/^/#/'  file

PD:各行が正規表現なので、EOFも使用できません。

答え1

次のサンプルデータを使用してくださいfile

foo
bar
xxx
yyy
zzz
foo
bar
#xxx
#yyy
#zzz

sed以下を含む-E拡張正規表現を使用してください。

$ sed -E 's/^(xxx|yyy|zzz)$/#&/' file
foo
bar
#xxx
#yyy
#zzz
foo
bar
#xxx
#yyy
#zzz

そしてawk

$ awk '/^(xxx|yyy|zzz)$/ { $0 = "#" $0 }; 1' file
foo
bar
#xxx
#yyy
#zzz
foo
bar
#xxx
#yyy
#zzz

使用標準sed:

$ sed -e '/^xxx$/bc' -e '/^yyy$/bc' -e '/^zzz$/bc' -e b -e ':c' -e 's/./#&/' file
foo
bar
#xxx
#yyy
#zzz
foo
bar
#xxx
#yyy
#zzz

答え2

次のテキスト例が与えられたとき:

foo
bar
xxx
yyy
zzz
foo
bar
#xxx
#yyy
#zzz

次のコマンドを使用できます。

$ sed 's/^\(xxx\|yyy\|zzz\)$/#\1/' file
foo
bar
#xxx
#yyy
#zzz
foo
bar
#xxx
#yyy
#zzz

  • ^[^#]*で始まらない行を解析します#
  • \(xxx\|yyy\|zzz\)検索xxxまたはキャプチャし、パターンを交換してyyyキャプチャします。zzz##\1

関連情報