9

在一个大文件中,我需要编辑文本并删除特定范围内的注释。对于这个简化的示例,我们假设范围从 开始_start_并在 结束_end_

我可以使用以下命令毫无问题地编辑文本:

sed -i -r "/_start_/,/_end_/ s/SearchText/ReplaceText/" FileName

请注意以下事项(当然,如果我的任何陈述不准确或误导,请告诉我):

  • 我使用-i它来编辑“文件名”,而不是写入不同的文件。
  • 我使用-r它是为了让它识别扩展的正则表达式(上面的简化示例中没有显示,但似乎工作正常)。
  • 我使用了双引号,以便它可以正确处理变量(上面的简化示例中也没有显示,但也可以按预期工作)。

上面的命令完全符合我的预期。所以我继续我的过程的第二步:一个非常相似的命令来删除这个范围内的注释行:

sed -i -r "/_start_/,/_end_/ /^#/ d" FileName

但是,这没有任何效果:开头的行#不会被删除。事实上,当我单独执行这个命令时,我的文件中绝对没有任何内容被更改或删除——无论是在范围内还是其他地方。

在我在这个网站和其他地方的搜索中,我发现了很多关于使用 sed 删除行的说明(我认为我正确遵循的说明)——但没有关于我正在经历的失败。

谁能告诉我我在这里做错了什么?

我对 UNIX/Linux 环境非常陌生,因此我绝对愿意接受有关如何处理该问题的其他建议。但只是为了满足我的挫败感,我很想知道我上面的 sed 命令有什么问题。

4

2 回答 2

8

最好的信息来源通常是手册页。您可以使用命令到达它man sed

d根据手册页获取地址范围。地址可以是数字、/regexp/ 或许多其他东西。地址范围是一个地址或两个地址,以逗号分隔。您一直在尝试使用地址范围,然后使用地址。

正如 1_CR 指出的那样,您可以改用块来解决:

sed -i -r "/_start_/,/_end_/ {/^#/ d}" FileName

一个块接受一个地址范围,每个命令再次接受一个地址范围,因此您可以组合正则表达式。

于 2013-10-24T21:13:07.517 回答
2

你需要改变

sed -i -r "/_start_/,/_end_/ /^#/ d" FileName

sed -i -r "/_start_/,/_end_/{/^#/d}" FileName
于 2013-10-24T21:09:01.443 回答