jak*_*b.g 93 sed awk text-processing replace
我用这个
cat foo.txt | sed '/bar/d'
删除bar文件中包含字符串的行。
然而,我想删除这些行和它之后的行。最好的sed,awk或者其他工具,在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行会留下来。
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”命令正常删除。