Sed:パターンを他のすべての改行文字に置き換えますか?

Sed:パターンを他のすべての改行文字に置き換えますか?

sed毎回発生するたびにパターンを置き換えるように指示する方法はありますか?それとも、少なくとも別の行ごとに? (もちろんスクリプトを使うことも可能ですが、できるかsed自分に聞いてみました。)

編集する

私が見つけた

sed -e "s/pattern/replacement/g;n"

ただし、2番目の発生ではなく、最初の発生を置き換えます。

はい

入力ファイル:

I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern

希望の出力:

I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement

答え1

sed 's/pattern/replacement/2'

パターンを持つ各行の2番目の項目が置き換えられます。


GNUがある場合sed

sed '1~2N ; s/pattern/replacement/2'

最初の行から始まり、後ろの行1がパターンスペースに追加され、Nコマンドsは2番目のパターン発生を置き換えます。その後、sed2行下に移動し~2て繰り返します。

答え2

バラよりhttps://stackoverflow.com/questions/5858200/sed-replace-every-nth-occurrence

解決策はsedの代わりにawkを使用しますが、「作業に適したツールを使用します」。そうであってもなくてもよい可能sedで実行されますが、それにもかかわらずたくさんawkやPerlなどのツールを使用する方が簡単です。

答え3

簡単な説明:

PATTERNが複数回含まれる最初の行では、これを無視してその行をそのまま印刷しようとします。 PATTERNが複数回含まれる2行目で、PATTERNの最初のインスタンスをREPLACMENTに置き換えようとしています。 PATTERNが複数回含まれる3行目では、その行をそのまま印刷しようとします。 PATTERNが複数回含まれる4行目で、PATTERNの最初のインスタンスをREPLACMENTに置き換えようとしています。など。 PATTERNと一致しない行は変更せずに印刷する必要があります。

これはSedを使用して次のように簡単に実行できます。

sed -e '/PATTERN/ { :inside' -e 'n;s//REPLACEMENT/;t' -e 'b inside' -e '}'

または、スペースを減らしてラベルを短くしてください。

sed -e '/PATTERN/{:i' -e 'n;s//REPLACEMENT/;t' -e 'b i' -e '}'

編集:ちょうど質問をもう一度読んで、より難しい説明を見つけました。

最初の発生と同じ行に発生するかどうかに関係なく、文書全体で2番目の発生するPATTERNをREPLACMENTに置き換えます。最初と3番目の項目を変更せずに維持します。など。

私はこれがはるかにトリッキーで、使用したい正規表現によって異なりますが、Sedを使用してこれを行うこともできると思います。問題の一部を解決して公開しようとしていますが、今はこの回答を上記の単純なバージョンと一貫して維持します。

答え4

1 行に 1 つの記号パターン: sed 's/(a[^a]*)a/\1c/g'

他のすべてのパターン(1行に1つのパターン一致のみが発生する可能性があります。1行に2つ以上の一致が発生した場合は、2番目のパターンのみが置き換えられます)

echo -e "test\nreplace_me\ntest\ntest\nreplace_me\nreplace_me\nreplace_me" | \
sed '/replace_me/{:a;N;/replace_me.*replace_me/!Ta;s/replace_me/replaced/2;}'

関連情報