web-dev-qa-db-ja.com

sed-特定の文字列に一致する行をコメント化し、まだコメント化されていない

私は次のテストファイルを持っています

AAA
BBB
CCC

次のsedを使用して、[〜#〜] bbb [〜#〜]行をコメント化できます。

# sed -e '/BBB/s/^/#/g' -i file

行の先頭にまだ#がない場合にのみ、コメントアウトしたいと思います。

# sed -e '/^#/! /BBB/s/^/#/g' file

sed: -e expression #1, char 7: unknown command: `/'

これを達成する方法はありますか?

複数の#sを含む行がない場合、これは機能します。

sed -e '/BBB/ s/^#*/#/' -i file

注:行ごとに最大1つの置換を行うため、/ gは必要ありません。

74
aragaer

このソリューションが最適に機能すると思います。

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

「#」記号の数は問題ではありません。別の記号を追加することはありません。検索するパターンに「#」が含まれていない場合、行の先頭に追加され、末尾のスペースも追加されます。

末尾のスペースが必要ない場合

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\1/' file

パターンスペースの一致部分全体を参照する&特殊文字を使用した別のソリューション。これは、正規表現グループをキャプチャして参照するよりも少し単純/クリーンです。

sed -i 's/^[^#]*BBB/#&/' file
3
agostonbarna

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

キーワード*.Sudoではコメントが機能しません。コメントはありません...

以下の構文のみが機能します:sed -e '/Sudo/ s/^#*/#/' file

1
Bill

実際には、キャレット記号は角かっこ内にあるものをすべて無効にし、検索からのすべてのハッシュ記号を無視するため、感嘆符(!)は必要ありません。この例は私のために働いた:

sed -i '/[^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

0
Dwayne Mcnab