shell - 从文件中删除模式匹配之间的行
问题描述
如何使用sed删除文件中两个模式之间的所有行。
这里的模式是//test
and //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
解决方案
这是常见的特点sed
sed '/^\/\/test$/,/^\/\/endtest/d'
正如/
用于绑定正则表达式一样,它们必须在正则表达式中被转义。
如果您想保留标记(按要求):
sed '/^\/\/test$/,/^\/\/endtest/{//!d}'
解释:
看一下info sed
,搜索sed address
->Regexp Addresses
和Range 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;}'
推荐阅读
- varnish - 如何在 ubuntu 18.04 上使用 ssl 终止配置清漆?
- javascript - 如何通过子组件的表单正确更改父级的状态?
- python - gaierror,[Errno 11001] getaddrinfo 在 django 中失败
- reactjs - 如何将对象从节点传递到下一个 js 组件
- mule - 条件不匹配但仍使用以下 dw 代码获得响应
- c++ - C++ - 如何将空格键转换为 cmd 输入的破折号
- mysql - 在表中插入自动增量和当前日期时间
- python - 从外部 txt.file 读取/写入时忽略 IF 语句
- html - 尝试 stroke-dasharray 时,包含字母的 CSS、SVG 图像不起作用
- c - yacc 和 lex 中的解析器