sedは正規表現で指定されたn行目をどのように置き換えますか?

sedは正規表現で指定されたn行目をどのように置き換えますか?

私はその行で指定された一致正規表現の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- 「コピー」を「コピーしない」に変更します。大文字と小文字を区別しません。

おすすめ記事