匹配后删除行 x

匹配后删除行 x

如何sed在匹配后删除第二行(或任何数字),但不包括匹配和中间的行?

例如:

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”行,因为它是“在下面的提示下输入您的密码”行之后的两行。我无法使用绝对行号位置,因为匹配可能会在文件开始后出现任意行数。

在线搜索我发现了很多类似的解决方案sed '/Enter your password.*/,+3d' filex,但这也会删除“输入您的密码...”行和以下行,这不是我想要的。我只想删除一行,即一场比赛后的一定数量的行。

我如何使用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} 1c是要忽略的匹配后的第 n 行,1用于打印输入记录
  • c && !--c{next}is&&短路运算符,因此只要c计算结果为 false,c就不会递减。设置为一个值后c,只要没有达到就会递减0

答案3

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

相关内容