尝试使用sed删除范围中的某些行

时间:2013-10-24 21:01:51

标签: linux sed

在大文件中,我需要编辑文本并删除特定范围内的注释。对于此简化示例,我们假设范围以_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命令出了什么问题。

2 个答案:

答案 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