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 と評価される&&
限り減少しません。値に設定すると、その値に達しない限り減少します。c
c
c
0
答え3
sed '/Enter your password.*/{N;p;N;d;}' file