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

Joe*_*ose 7 linux sed

在大文件中,我需要编辑文本并删除特定范围内的注释.对于这个简化的例子,让我们假设范围从开始_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命令有什么问题.

thi*_*ton 6

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

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

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

sed -i -r "/_start_/,/_end_/ {/^#/ d}" FileName
Run Code Online (Sandbox Code Playgroud)

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