1行で2つのパターンを見つけてパターンを削除し、それらの間の順序を指定します。

1行で2つのパターンを見つけてパターンを削除し、それらの間の順序を指定します。

次の行を含むファイルがあります。

ABCDABCBCBBBCBCDDBBBBBBBBBBBBBBBBBBBBBBBBBXYZ
ABCDCCCBCCBBBBBBBBBBBBBBBBBBBBBBXYZ
ABCDACDCDCCCCBBBBBBBBBBBBBBBBBBBBBBBBXYZ

そして私は欲しい

BBBBBBBBBBBBBBBBBBBBBXYZ
BBBBBBBBBBBBBBBBBBXYZ
BBBBBBBBBBBBBBBBBBBBXYZ

したがって、目標は、ABCD連続した4つのsが最初に表示されたときから始まり、すべての項目を削除することですB。すべての行はで始まることが保証され、s以前の「関連」チェーンが終了する前に行にABCD「去る」ことはあってはなりません。BBBBBXYZ

私はsedこれに近いバリエーションを試しました。

sed 's/ABCD.*BBBB//g' filename 

XYZ最後のパターンまでは止まらないのであげるようですがBBBB、最初のパターン以降は止めたいです。

どんな助けでも大変感謝します! !

ベストアンサー1

sedあなたが疑うように、あなたの方法が失敗する理由は、それがsed正規表現に基づいており、これが「貪欲」であるからです。つまり、説明できる最も長い文字列を一致させようとします。

だからこれが課題かもしれませんawk。次のプログラムを検討してください。

awk '{n=index($0,"BBBB"); print substr($0,n+4)}' input.txt

BBBB$0次に、現在の行で部分文字列(で示されている)が最初に表示される場所を見つけ、その場所をに保存しますn。次に、その位置から始めて、B行の最後まで4(最初の4秒を削除するため)を加えた行の部分を印刷します。

ABCD例の入力からわかるように、ここにはスタートモードへの言及はありません。みんな行はで始まりますABCD。この場合、行の先頭から(最初の4--を含む)パターンまですべての内容を削除すれば十分ですB。仮定が間違っている場合、特にBBBB以前に発生する可能性がある場合、期待ABCDどおりに機能しません。

おすすめ記事