では簡単になりそうですが、そうできるかどうか疑問にawk
思います。sed
これは私の入力です。
line 1
line 2
line 3
line 1
line 2
line 3
line 1
line 2
line 3
line 1
2番目の正規表現を見つけ、それ以降に見つかったすべてを変更するために内部正規表現を作成したいと思いますline 3
。出力は次のとおりです。
line 1
line 2
line 3
line 1
line 2
replaced
line 1
line 2
replaced
私は実際にこの入力でのみ動作する「賢い」ソリューションを探しているわけではありません。一般的な検索と置換方法があるかどうかを知りたいです。後ろにと一致しますsed
。
解決策はどこかにあると思いました。addr
出荷書類ビーチ、ところでできることだと説明されていないようで/starting point/,s/...
、しようとするとエラーが出ます。
ベストアンサー1
そのためには、目標線を見た回数を数える必要があります。残念ながら、何でも計算するのはsed
PITAです。awk
またはでこれを行うことをお勧めしますperl
。たとえば、
$ perl -p -e '$found++ if m/line 1/;
next if $found < 2;
s/line 3/replaced/' input.txt
line 1
line 2
line 3
line 1
line 2
replaced
line 1
line 2
replaced
またはawk
:
$ awk '/line 1/ { found++ };
found < 2 { print ; next };
{ sub(/line 3/,"replaced") ; print }' input.txt
line 1
line 2
line 3
line 1
line 2
replaced
line 1
line 2
replaced
これらの方法は効果的ですが、最高のソリューション、特にawk
バージョン(Perlを直接翻訳したもの)とは遠いです。
ところで、どちらのバージョンも正規表現を使って検索し、計算、検索する正規表現、変える、代替文字列、さらに必要な数までスクリプトにハードコードする代わりに、コマンドラインオプションとして使用できます。