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