web-dev-qa-db-ja.com

BASHで一致するパターンを含む行の前に#を追加するにはどうすればよいですか?

パターン「000」を含む行の前に#を追加する必要があります。たとえば、次のサンプルファイルを検討します。

This is a 000 line.
This is 000 yet ano000ther line.
This is still yet another line.

コマンドを実行すると、_000が見つかったファイルの先頭に#が追加されます。結果は次のようになります。

#This is a 000 line.
#This is 000 yet ano000ther line.
This is still yet another line.

私ができる最善のことは、このように複雑すぎると思われるwhileループです:

while read -r line
do
    if [[ $line == *000* ]]
    then
          echo "#"$line >> output.txt
    else
          echo $line >> output.txt
    fi
done < file.txt

パターンが見つかった行の先頭に#を追加するにはどうすればよいですか?

25
Village

これはあなたのために働くかもしれません(GNU sed):

sed 's/.*000/#&/' file
22
potong

次のsedコマンドが機能します。キャプチャグループは必要ありません。

sed /000/s/^/#/

説明:

  • /000/は、000の行に一致します
  • sは、上記で一致した行で置換を実行します
  • 置換により、行の先頭にポンド文字(#)が挿入されます(^
57
Tim Cooper

問題は、ファイル内のこれらの行にポンド記号を追加する方法でした。そのため、ティムクーパーの優れた答えをより完全にするために、以下を提案します。

sed /000/s/^/#/ > output.txt

または、sedの機能を使用して問題のファイルをインプレース編集し、次のようなバックアップコピーを作成することを検討できます。

sed -i.bak /000/s/^/#/ file.txt

「-i」オプションは、ファイルをインライン/インプレースで編集および保存します。「-i.bak」オプションは、何かがおかしくなった場合に元のファイルをfile.txt.bakにバックアップします。

「.bak」を好みのサフィックスに置き換えることができます。例:「-i.orignal」は元のファイルを「file.txt.orignal」として作成します

3
geegee

またはedを使用します:

echo -e "g/000/ s/^/#/\nw\nq" | ed -s FILENAME

またはedでファイルを開きます:

ed FILENAME

そしてこのコマンドを書く

g/000/ s/^/#/
w
q
1

これを試してくださいGNU= sedコマンド、

$ sed -r '/000/ s/^(.*)$/#\1/g' file
#This is a 000 line.
#This is 000 yet ano000ther line.
This is still yet another line.

説明:

  • /000/ sed置換は、000を含む行でのみ機能します。対応する行を見つけると、その前に#記号を追加します。

そしてawkを通じて、

$ awk '/000/{gsub (/^/,"#")}1' file
#This is a 000 line.
#This is 000 yet ano000ther line.
This is still yet another line
  • gsub関数は、#を含む行の前に000を追加するために使用されます。
0
Avinash Raj