始まる単語に基づいて行にコメントを付けるには?

始まる単語に基づいて行にコメントを付けるには?

サンプルファイルの内容:

--------------------
NETWORKING=yes
HOSTNAME=wls1.ebs-testsrvrs.com
# oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes
NOZEROCONF=yes
--------------------

「HOST」で始まるすべての行をコメントアウトしたいです。

答え1

存在するvi

:%s/^HOST/#&/

または

:g/^HOST/s//#&/

最初のコマンドは%「フルバッファから」を意味し、縮小は最初の行1,$から最後の行までを意味します。&置換セクションの置換内容は、^HOSTパターン()に一致する全文で置き換えられます。

2番目のコマンドは、s///セルフエディタを継承したグローバル()コマンドを使用して、一致したすべての行に置換()を適用します。 2番目のケースでは、コマンドは空の正規表現を使用します。これにより、コマンドで最近使用した正規表現を再利用できます。置換は最初のコマンドと同じです。^HOSTgvieds///^HOSTg

そしてsed

sed 's/^HOST/#&/' input >output

または

sed '/^HOST/s//#&/' input >output

viin(常に入力ストリームのすべての行にすべてのコマンドを適用するため、このようなものを明示的sedには使用しません)と同じ方法です。%gsed


到着削除する次に始まる行のコメント文字#HOST:

sed 's/^#HOST/HOST/' input >output

または

sed '/^#HOST/s/.//' input >output

上記の2つのコマンドのうち、2番目のコマンドは、で始まるすべての行s///にコマンドが適用されます#HOST。このs///コマンドは行の最初の文字のみを削除します。

viこれら2つのコマンドに対応するコマンドは次のとおりです。

:%s/^#HOST/HOST/

そして

:g/^#HOST/s/.//

それぞれ

答え2

オプションと一緒にsedを使用して-iファイルを所定の位置に編集します。 (元のバックアップコピーがとして保存されますfile.txt.bak。) sed -i.bak 's/^\(HOST.*\)/#\1/g' file.txt

正規表現部分をお読みください:^行の先頭に一致します。

()一致するテキストを一時的な内部変数()として取得します\1

\文字の前に必要です。(そうしないと、シェルが文字を盗むからです。

.*0個以上の文字と一致します。

したがって、行の先頭から始まり、HOST文字列と改行文字までのテキストが一致します。行が一致しない場合はそのままにしてください。一致するものがある場合はが#\1印刷され、#その後にテキストが表示されます()

答え3

Perl 1ライナー:

perl -pe 's/^HOST/#$&/' file

または、その場所でファイルを編集します。

perl -i -pe 's/^HOST/#$&/' file

説明する

-pe方法与えられたスクリプトを適用した後、各入力行を印刷します-e。各行のs/foo/bar/最初のインスタンスを置き換える代替演算子です。ここでは、(行の先頭を表す)で始まる行をaと一致する内容(一致する内容を格納する特殊変数)に置き換えます。だから私たちはに置き換えます。foobarHOST^#$&HOST#HOST

答え4

パール1行:

$ perl -ne 'if(/^HOST/){print "#$_"} else { print}' input.txt                                  
--------------------
NETWORKING=yes
#HOSTNAME=wls1.ebs-testsrvrs.com
# oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes
NOZEROCONF=yes
--------------------

この単純な1行の行はすべての行を通過し、行が次から始めて追加されることを確認HOSTします。それ以外の場合は、ステートメント#に移動して変更されていない行のみを印刷します。else

同じ内容のPythonバージョンは次のとおりです。

python -c "import sys;print '\n'.join([ '#' + l.strip() if l.startswith('HOST') else l.strip()  for l in sys.stdin  ])" < input.txt

ただし、行のリスト(または配列)を作成し、条件に応じて行自体または追加の行を挿入する方法で、若干異なる動作をします#。結局、配列は1つの大きな文字列に連結され、項目は改行で区切られて印刷されます。

関連情報