2つのパターン間の文字列をsedして削除します。

2つのパターン間の文字列をsedして削除します。

sedを使用して2つのパターン間の文字列の一部を削除するのに問題があります。私は常に最後のPATTERN-2をソートします。

テスト.txt:

PATTERN-1xxxxPATTERN-2aaa
PATTERN-1xxxxPATTERN-2fffPATTERN-1zzzzPATTERN-2gggPATTERN-1zzzzPATTERN-2
PATTERN-1xxxxPATTERN-2bbb

ガイドライン

sed 's/PATTERN-1.*PATTERN-2//g' test.txt

上記の結果は

aaa

bbb

しかし、私は欲しい

aaa
fffggg
bbb

PATTERN-1に最も近いPATTERN-2を見つけることができますか?

答え1

@steeldriverが指摘したように、貪欲ではない正規表現があれば簡単です。そうでない場合は、次のようにループを使用して実行できます。

sed ':a;s/PATTERN-2/\n/;s/PATTERN-1.*\n//;ta' test.txt

これは、行の途中に改行文字がないことがわかっているために機能します。これは、どの行にも表示されない他の文字(たとえば)にも当てはまります§

答え2

sedを使用したい場合は、以下を試してください。

sed 's/PATTERN-1[^P]*PATTERN-2//g' test.txt

答え3

あなたの例では、.*は保持したいものと一致します。

そのコンテンツをキャプチャし、次に戻すことができます。

sed 's/PATTERN-1\(.*\)PATTERN-2/\1/g' test.txt

角かっこ間のすべての内容は、最初のキャプチャバッファに格納され、\1そのバッファの値に置き換えられます。

答え4

「最も近い」は実際にはsedという用語ではありません。ただし、シーケンスの反復回数に合理的な制限がある場合は、PATTERN-1.*PATTERN-2次のようにその番号をハードコードできます。

     $ sed -E 's/(PATTERN-1).*(PATTERN-2)(.*)\1.*\2/\3/g;s/PATTERN-1.*PATTERN-2//g' <<"end"
     PATTERN-1xxxxPATTERN-2aaa
     PATTERN-1xxxxPATTERN-2fffPATTERN-1zzzzPATTERN-2gggPATTERN-1zzzzPATTERN-2
     PATTERN-1xxxxPATTERN-2bbb
     end

     aaa
     ggg
     bbb

-E拡張正規表現構文オプションを使用することに注意してください。また、検索式では、ユーザーの便宜のために、PATTERN-1および-2文字列の逆参照を使用しています。

関連情報