我有一个配置文件,其中包含多个条目。
如何使用bash搜索New
并删除它以及与之相关的所有条目?
Test {
blah..
site {
id
}
location {
id
}
staff {
access {
}
}
}
New {
blah..
site {
id
}
location {
id
}
staff {
access {
}
}
}
Link {
blah..
site {
id
}
location {
id
}
staff {
access {
}
}
}
导致
Test {
blah..
site {
id
}
location {
id
}
staff {
access {
}
}
}
Link {
blah..
site {
id
}
location {
id
}
staff {
access {
}
}
}
我知道我可以使用grep
来找到匹配的结果,但是我如何删除它呢?例如:grep -m 1 -A25 New test.txt
edit看起来这样可以删除输出并给予正确的结果。
grep -m 1 -A25 New test.txt > test | grep -v -x -f test test.txt
,但它留下了一个冗余文件test
,原始文件没有更新。
有没有更好的方法来做到这一点,所以没有冗余的文件,并更新原始文件?
5条答案
按热度按时间dsf9zpds1#
命令
sed 's/^New/,/^}/d'
对我来说很好用。这是我粘贴你的示例时的输出:c9x0cxw02#
你可以用下面的正则表达式在
}
和\w+[^{]*{
之间的空格上进行分割:Demo
一旦你有了块,过滤掉
New
。下面是一个Ruby演示:但是你可以用Perl、Python等做同样的事情。
或者,一个Perl:
正则表达式的Demo
e4yzc0pl3#
使用
awk
:输出:
eblbsuwk4#
piah890a5#
使用
recursive regex
的perl解决方案如何:该模式匹配一个字符串
New
序列,后跟一组 balanced 的花括号:[^{}]+
匹配大括号以外的任何字符。(?1)
告诉正则表达式引擎在这个位置嵌入带括号的模式(下面会提到)。(?:[^{}]+|(?1))
是上述模式的交替。(\{(?:[^{}]+|(?1))*})
由一对花括号括起来,并由(?1)
递归引用,以使模式与嵌套的花括号对匹配。