首页 > 解决方案 > 从文件中删除模式匹配之间的行

问题描述

如何使用删除文件中两个模式之间的所有行。

这里的模式是//testand //endtest,文件内容:

blah blah blah
c
f
f
[
]
//test
all text to be deleted 
line1
line2
xyz
amv
{
//endtest
l
dsf
dsfs

预期结果:

blah blah blah
c
f
f
[
]
//test
//endtest
l
dsf
dsfs

标签: shellsed

解决方案


这是常见的特点sed

 sed '/^\/\/test$/,/^\/\/endtest/d'

正如/用于绑定正则表达式一样,它们必须在正则表达式中被转义。

如果您想保留标记(按要求):

sed '/^\/\/test$/,/^\/\/endtest/{//!d}'

解释:

看一下info sed,搜索sed address->Regexp AddressesRange Addresses.

括起来{ ... },符号//表示任何界限。

空正则表达式 '//' 重复最后一个正则表达式匹配(如果将空正则表达式传递给 's' 命令,同样如此)。

!均值not,那么d对于delete line

替代方案:你可以写:

sed '/^\/\/\(end\)\?test$/,//{//!d}' 

或者

sed -E '/^\/\/(end)?test$/,//{//!d}'

将同样工作,但请注意,如果在第一个打开模式 ( )之前//endtest可能存在一些额外的模式,这可能会逆转效果。//test

...所有这些都是使用GNU sed 4.4完成的!

MacOS、BSD下sed

在 MacOS 下,我已经成功地使用以下语法删除了想要的行:

sed '/^\/\/test$/,/^\/\/endtest/{/^\/\/\(end\)\{0,1\}test$/!d;}'

或者

sed -E '/^\/\/test$/,/^\/\/endtest/{/^\/\/(end)?test$/!d;}'

推荐阅读