ファイル内の発生ごとに複数の行を削除するにはどうすればよいですか?


10

この857835行ファイルがあり、次のようなものが含まれているとします。

a1
rubbish1
rubbish2
rubbish3
rubbish4
a1
rubbish5
rubbish6
rubbish7
rubbish8

そしてa1、次の行(rubbish1およびrubbish5この例では)の出現をすべて削除したいと思います。どうすればいいのですか?

私はgrep 'a1' -v -A1役に立たないように試みました、そして私のsed skillzは本当に素晴らしくありません:}

今回、Google-fuは私を助けてくれませんでした。誰か助けてください!

回答:


15

試してください:

sed -e '/^a1$/,+1d' "filename"

これは、/ ^ a1 $ /から次の行までを削除することを意味します

^と$は行全体と一致することを保証するため、非表示のa1は一致しません。


6
その一致では、行全体を強制的に一致させたい場合が^あり$ます。
ジャンダー

@ジャンダー:もちろん、修正
asoundmove

12

以下は非GNUで動作しますsed,+1アドレス構文はGNU拡張です):

sed -e '/^a1$/,/^/d' my_file >my_filtered_file

「正確に「a1」を読み取る行から開始し、行の先頭が存在する次の行(つまり、次の行)で終了する場合、削除します。」

ただし、@ asoundmoveの回答よりもはるかに拡張性が低くなります。これは、異なる行数を削除すると、まったく異なるスクリプトが実行されるためです。

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