複数の特定の行番号(範囲ではない)をsedと一致させることは可能ですか?


9

検討してください:

echo -e "a\nb\nc\nd\ne\nf\ng\nh" | sed '3,5a test'

これは、3、4、5行目と一致します。

しかし、私は3行目と5行目(4行目ではなく)のみを一致させようとしています。そして、それらの後に「テスト」を追加します。

回答:


9
echo ... | sed -e '3a test' -e '5a test'

この場合よりも操作が複雑な場合は、次のような構造を使用できます。

sed 'b pattern; : action; a \
lalala
b end; : pattern; 3b action; 5b action; : end'

つまりは、あなたが間を必要とするすべてのコマンド入れるb pattern;とをb end;

そして、の後にすべてのパターン(行番号など)を追加します: pattern;

何が起こるか:

  1. 最初のコマンドは、アクション部分を飛び越えます(パターンが最初でb end;、アクション部分の直前にあると、読みやすくなります)。

  2. パターンが一致した場合、実行はアクション部分にジャンプします。アクションパーツの実行後、最後にジャンプします。

私はこれを片付けようとします:

sed '3b action; 5b action; b end; : action; a \
lalala
: end'

一行でのようになります:

sed "3b idAction; 5b idAction; b; : idAction; a test"

移植可能に、あなたはそれを書く必要があります:

sed '
   3b action
   5b action
   b
   : action
   a\
   lalala'

b最後までラベルが分岐しないため、明示的なendラベルは必要ありません。;標準のsed実装では、ラベル内の文字として有効です)。


4
うわー、sedのサブルーチン。クール
グレン・ジャックマン14

うわー、本当に、あなたはそれらを拡張できますか?彼らは本当に便利に見えます!
terdon

「パターン」と「アクション」のあるものは、「テスト」(または「ラララ」)を繰り返す必要がないので非常に良いようです。:)
アクエリアスパワー

@terdon私は何ができるでしょうか?
Hauke Laging 14

2つ目は見栄えは良いが理解が難しいことを意味し、時間があれば説明をお願いします。
terdon

5

sed(@HaukeLagingの回答を参照)

awk

$ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | awk 'NR==3 || NR==5{$0=$0"\ntest"}1;'

perl

$ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | perl -pe '$_ .="test\n" if $. == 3 || $. == 5'

「スマート一致」演算子を使用した缶ゴルフあなたのperlのビットは、:perl -lnE 'say if $. ~~ @{[3,5]}'
グレンはジャックマン

@glennjackmanああ、そうです、ありがとう。私は少し警戒していることを認めざるを得~~ません。また、両方say~~perl v> = 5.10が必要ですか?
terdon

その行の後に「テスト」を追加する必要があります。最初からそれを明確にした方がよかったと思います。OPを編集しました。
Aquarius Power 14

@AquariusPower、perl -pE 'say "test" if $. ~~ @{[4,6]}'-これ行の先頭に追加されます。perl は指定されたプログラムの最後-p暗黙の出力を行います。
グレンジャックマン14

@AquariusPowerも更新された回答を参照してください。
terdon

3

@HaukeLaging aleadyが言ったように、このコマンドはあなたが望むことをします:

sed -e'3a test' -e'5a test'

これで、たとえば20行と一致させたい場合、入力がかなり面倒になる可能性があります。

これらのケースでは、シェルがブレース展開をサポートしていると想定して、代わりにこのコマンドを使用できます。

sed -e{3,5}'a test'

(中括弧とコンマは引用符で囲まないでください。)

その結果、シェルは引数をsedに渡し-e3a testたり-e5a test、sedに渡したりします。これはまさに最初のコマンドが行うことです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.