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

  • 本文关键字:范围内 删除 sed linux sed
  • 更新时间 :
  • 英文 :


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

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

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

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

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

上面的命令正在做我希望它做的事情。所以我继续我的流程的第二步:一个非常相似的命令来删除此范围内的注释行:

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

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

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

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

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

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

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

正如1_CR指出的,您可以通过改用块来解决此问题:

sed -i -r "/_start_/,/_end_/ {/^#/ d}" FileName
一个块接受一个地址范围,

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

你需要改变

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

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

在完全按照您的问题要求进行操作方面,您也可以对一系列行号执行相同的操作。它不使用正则表达式,但如果查看行号对您来说很方便,您可能会发现这样做更容易:

sed -i '<start-of-range>,<end-of-range>d' FileName

最新更新