Sed:改行ごとにパターンを置き換えますか?


10

sed2回目に発生するたびにパターンを置き換えるように指示する方法はありますか?または、少なくとも1行おきに?(確かに、それはスクリプトで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

回答:


6

/programming/5858200/sed-replace-every-nth-occurrenceを参照してください

ソリューションは、sedではなくawkを使用しますが、「ジョブに適したツールを使用する」。sedで実行できる場合とできない場合がありますが、可能であっても、awkやperlなどのツールを使用する方がはるかに簡単です。


1
私がそこで学んだことを使ってsed -e 'n;s/2004-2009/6e législature/g'、メイドが私の問題を解決しました。
Matthieu Riegler、2012

1
これは、2番目ごとに発生するのではなく、2 ごとにパターンを検索します。つまり、1行目、3行目、5行目、7行目などの行をスキップします。もちろん、それでも特定のドキュメントで機能する場合があります。
cas

そうだね。それが実際に必要だったのです。
Matthieu Riegler 2012

14
sed 's/pattern/replacement/2'

パターンを持つすべての行の2番目のオカレンスを置き換えます。


あなたがGNUを持っているならsed

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

1行目から始めて1、その後ろの行がパターンスペースに追加されNsコマンドは2番目に出現するパターンを置き換えます。次に、sed2行下に移動し~2て繰り返します。


秒は欲しくありませんが毎秒です。
Matthieu Riegler、2012

1行に1つのパターンがあります。それはうまくいきません。
Matthieu Riegler、2012

事前に知っておくと良かったでしょう。したがって、パターンは1、2、3、4行目などで発生し、2、4行目などでパターンを置き換えますか?
llua 2012

短い代替案code(sed '
1〜2s

2

簡単な解釈:

少なくとも1つのPATTERNのオカレンスを含む最初の行では、それを無視して、その行をそのまま印刷します。PATTERNの少なくとも1つのオカレンスを含む2行目で、PATTERNの最初のインスタンスをREPLACEMENTに置き換えます。少なくとも1つのPATTERNのオカレンスを含む3行目に、その行をそのまま印刷します。PATTERNの少なくとも1つのオカレンスを含む4行目で、PATTERNの最初のインスタンスをREPLACEMENTに置き換えます。等々。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を、最初の出現と同じ行にあるかどうかに関係なく、REPLACEMENTに置き換えます。最初と3番目のオカレンスは変更しないでください。等。

これはSedでもできると思いますが、かなりトリッキーであり、使用する正規表現に依存していると思います。私は何かを解決して投稿しようとしますが、今のところ、上記の簡単なバージョンでこの答えを立てさせます。


testをquitで置き換え、次のような入力を{ sed '...'; cat; } <input1回だけ行う
mikeserv

1

あなたは非常に近かったので、最初の行をスキップしてください:

sed '1n;s/pattern/replacement/;n'

awkこの場合、なぜより良いツールであるべきですか?


0

1行内の1つのシンボルパターン:sed 's /(a [^ a] *)a / \ 1c / g'

2番目ごとのパターン(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;}'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.