私はその行で指定された一致正規表現の3番目(またはより一般的にはn番目)の出現を置き換えるためにsedを使用します。これまでは、最初の操作しか実行できません。
$cat file
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C
これまで私はただ
$ cat file| sed -E '0,/copy/I s//No-&/'
# Golden dictionary is a versatile multi purpose reference
# No-Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C
ゲームが3つしかない場合はどうすればいいですか?
答え1
edを使用すると、大文字と小文字を区別しない3番目の「コピー」の前に「No-」を付けると、次のようになります。
ed -s file <<< $'/[Cc][Oo][Pp][Yy]/\n//\n//\ns//No-&/\nw\nq' > /dev/null
コマンドは次のとおりです。
/[Cc][Oo][Pp][Yy]/
- 大文字と小文字を区別せずに「copy:」を手動で検索します。//
- 検索を2回繰り返します。s//No-&/
- 最後の一致を「No-」プレフィックスに置き換えます。w
- 変更されたファイルをディスクに書き込むq
——編集終了
sedを使用すると、変更したい行番号を見つけるためにいくつかの辞書操作を実行できます。
sed -i $(grep -in copy file |awk -F: 'NR==3 { print $1 }')'s/copy/No-&/i' input
左から右に作業してください。
-i
- GNU sedの内部編集オプション$( ... )
- 「コピー」に一致する3行目の番号を探すgrep -in copy file
- 大文字と小文字を区別せずに「コピー」という単語を見つけ、file
一致する行番号を報告します。awk -F: 'NR==3 { print $1 }'
- grep出力の行3からコロンに行を分割し、列1(行番号)を報告します。
s/copy/No-&/i
- 「コピー」を「コピーしない」に変更します。大文字と小文字を区別しません。
答え2
を使用してawk
文字列を含む行数を数えてCopyright
3行目に達すると、その行の最初の項目に対して置換を実行します。
awk '/Copyright/ && ++n == 3 { sub("Copyright", "No-&") } { print }' file
&
置換に使用されることは、正規表現が一致するすべてを意味します。この場合、Copyright
挿入する文字列になります。この(使用)は、例えば&
にも当てはまります。sed
最初のブロックより前の条件、
/Copyright/ && ++n == 3
Copyright
文字列を現在の行と一致させます。一致するものがあればn
増加します。増分値がn
3に等しい場合、ブロックが実行されます。
テスト:
$ cat file
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C
(ファイルはあなたのファイルと同じですが、内容が繰り返されます)
$ awk '/Copyright/ && ++n == 3 { sub("Copyright", "No-&") } { print }' file
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# No-Copyright (C) 2015-2016 C
# Golden dictionary is a versatile multi purpose reference
# Copyright (C) 2004-2008 A
# Copyright (C) 2008-2015 B
# Copyright (C) 2015-2016 C