删除包含特定字符串的行和以下行

jak*_*b.g 93 sed awk text-processing replace

我用这个

cat foo.txt | sed '/bar/d'

删除bar文件中包含字符串的行。

然而,我想删除这些行和它之后的行。最好的sedawk或者其他工具,在MINGW32的可用。

这是我可以grep使用-A-B打印匹配行以及匹配行之前/之后的行的一种相反。

有什么简单的方法可以实现吗?

Gil*_*il' 97

如果您有 GNU sed(非嵌入式 Linux 或 Cygwin):

sed '/bar/,+1 d'
Run Code Online (Sandbox Code Playgroud)

如果您有bar连续两行,这将删除第二行而不分析它。例如,如果你有一个3线文件bar/ bar/ foo,该foo行会留下来。

  • `sed '/bar/d'` 如果您只想“删除包含特定字符串的行”而**不**下一个。 (14认同)
  • @Pandya 那是不同的。你可以使用例如`sed'/math/q'` (2认同)
  • @AK 如果你只是想删除匹配的行,那就更简单了:`sed '/bar/d'` (2认同)

Sté*_*las 18

如果bar可能出现在连续行上,您可以执行以下操作:

awk '/bar/{n=2}; n {n--; next}; 1' < infile > outfile
Run Code Online (Sandbox Code Playgroud)

通过将上面的 2 更改为要删除的行数,包括匹配的行数,可以适应删除 2 行以上的行。

如果没有,可以sed使用@MichaelRollins 的解决方案轻松完成,或者:

sed '/bar/,/^/d' < infile > outfile
Run Code Online (Sandbox Code Playgroud)


Hai*_* Vu 14

我不精通 sed,但在 awk 中很容易做到:

awk '/bar/{getline;next} 1' foo.txt 
Run Code Online (Sandbox Code Playgroud)

awk 脚本读取:对于包含 bar 的行,获取下一行(getline),然后跳过所有后续处理(next)。最后的 1 模式打印剩余的行。

更新

正如评论中所指出的,上述解决方案不适用于连续的bar. 这是一个修订后的解决方案,它考虑了它:

awk '/bar/ {while (/bar/ && getline>0) ; next} 1' foo.txt 
Run Code Online (Sandbox Code Playgroud)

我们现在继续阅读以跳过所有 /bar/ 行。


小智 9

您将希望利用 sed 的脚本功能来完成此操作。

$ sed -e '/bar/ { 
 $!N
 d
 }' sample1.txt
Run Code Online (Sandbox Code Playgroud)

样本数据:

$ cat sample1.txt 
foo
bar
biz
baz
buz
Run Code Online (Sandbox Code Playgroud)

“N”命令将输入​​的下一行附加到模式空间中。这与模式匹配中的行 (/bar/) 相结合将是您要删除的行。然后您可以使用“d”命令正常删除。