一致後の行xの削除

一致後の行xの削除

sed一致後に2番目の行(または任意の数字)を削除し、一致とその間の行を除外するにはどうすればよいですか?

たとえば、

Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
> mysecretword
Password accepted

「> mysecretword」行は「下のプロンプトにパスワードを入力してください」行の後に2行があるので削除したいと思います。ファイルの開始後、任意の行数で一致が発生する可能性があるため、絶対行番号の場所は使用できません。

オンライン検索で同様の解決策がたくさん見つかりましたが、sed '/Enter your password.*/,+3d' filex「パスワードを入力してください...」行と次の行も削除されますが、これは私が望むものではありません。一度一致した後、特定の行数の1行だけを削除したいと思います。

sedこれを行うには(または他の一般的なツール)、どのように使用しますか?

答え1

おそらく

sed '/^Enter your password/ {
n
n
d
}' file

または均等に:

$ sed '/^Enter your password/ {n;n;d;}' file
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
Password accepted

答え2

一般的なケースでは、Ed Mortonの素晴らしい答えを参照してください。sedまたはawkを使用して、一致するパターンと一致する行を印刷します。

d)特定の正規表現の後のN番目のレコードを除くすべてのレコードを印刷します。

awk 'c&&!--c{next}/regexp/{c=N}1' file

与えられた入力に適用

$ awk 'c && !--c{next} /^Enter your password/{c=2} 1' ip.txt 
Enter command below
> login
Command valid
Enter your password at the below prompt
Remember to make sure no-one is looking at your screen
Password accepted
  • /^Enter your password/{c=2} 1これはc無視され、1入力レコードを印刷するために使用される一致の後のn番目の行です。
  • c && !--c{next}は段落演算子なので、false と評価される&&限り減少しません。値に設定すると、その値に達しない限り減少します。ccc0

答え3

sed '/Enter your password.*/{N;p;N;d;}' file

関連情報