在大文件中,我需要编辑文本并删除特定范围内的注释.对于这个简化的例子,让我们假设范围从开始_start_
并结束_end_
.
我可以使用如下命令编辑文本没有问题:
sed -i -r "/_start_/,/_end_/ s/SearchText/ReplaceText/" FileName
Run Code Online (Sandbox Code Playgroud)
请注意以下事项(当然,如果我的任何陈述不准确或误导,请告诉我):
-i
它,它将编辑"FileName",而不是写入不同的文件.-r
这样使用它会识别扩展的正则表达式(在上面的简化示例中没有显示,但它似乎正常工作).上面的命令完全符合我的预期.所以我转到了我的过程的第二步:一个非常类似的命令来删除此范围内的注释行:
sed -i -r "/_start_/,/_end_/ /^#/ d" FileName
Run Code Online (Sandbox Code Playgroud)
但是,这没有任何效果:#
不删除以开头的行.实际上,当我单独执行此命令时,我的文件中的任何内容都不会被更改或删除 - 既不在范围内也不在其他地方.
在我在这个网站和其他地方的搜索中,我发现了许多关于使用sed删除行的说明(我认为我正确遵循的说明) - 但没有关于我遇到的故障.
任何人都可以告诉我这里我做错了什么?
我是UNIX/Linux环境的新手,所以我绝对愿意接受有关如何处理这个问题的替代建议.但为了满足我的挫败感,我很想知道上面我的sed命令有什么问题.
最佳信息来源通常是手册页.您可以使用该命令访问它man sed
.
d
根据手册页获取地址范围.地址可以是数字,/ regexp /或许多其他内容.地址范围是一个地址或两个地址,以逗号分隔.您一直在尝试使用地址范围,然后使用地址.
正如1_CR指出的那样,您可以使用块来解决:
sed -i -r "/_start_/,/_end_/ {/^#/ d}" FileName
Run Code Online (Sandbox Code Playgroud)
块接受地址范围,并且每个命令再次接受地址范围,因此您可以组合正则表达式.