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文字列の逆参照を使用しています。