次の行を含むファイルがあります。
ABCDABCBCBBBCBCDDBBBBBBBBBBBBBBBBBBBBBBBBBXYZ
ABCDCCCBCCBBBBBBBBBBBBBBBBBBBBBBXYZ
ABCDACDCDCCCCBBBBBBBBBBBBBBBBBBBBBBBBXYZ
そして私は欲しい
BBBBBBBBBBBBBBBBBBBBBXYZ
BBBBBBBBBBBBBBBBBBXYZ
BBBBBBBBBBBBBBBBBBBBXYZ
したがって、目標は、ABCD
連続した4つのsが最初に表示されたときから始まり、すべての項目を削除することですB
。すべての行はで始まることが保証され、s以前の「関連」チェーンが終了する前に行にABCD
「去る」ことはあってはなりません。BBBB
B
XYZ
私は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
どおりに機能しません。