Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 尝试使用sed删除范围内的某些行_Linux_Sed - Fatal编程技术网

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

Linux 尝试使用sed删除范围内的某些行,linux,sed,Linux,Sed,在一个大文件中,我需要编辑文本并删除特定范围内的注释。对于这个简化的示例,假设范围从\u开始开始,到\u结束结束 我可以使用如下命令毫无问题地编辑文本: sed -i -r "/_start_/,/_end_/ s/SearchText/ReplaceText/" FileName 请注意以下事项(当然,如果我的任何陈述不准确或误导,请告诉我): 我使用了-I,这样它就可以在位编辑“FileName”,而不是写入其他文件 我使用了-r,这样它就可以识别扩展正则表达式(在上面的简化示例中没有显

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

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

sed -i -r "/_start_/,/_end_/ s/SearchText/ReplaceText/" FileName
请注意以下事项(当然,如果我的任何陈述不准确或误导,请告诉我):

  • 我使用了
    -I
    ,这样它就可以在位编辑“FileName”,而不是写入其他文件
  • 我使用了
    -r
    ,这样它就可以识别扩展正则表达式(在上面的简化示例中没有显示,但似乎工作正常)
  • 我使用了双引号,这样它就可以正确地处理变量(在上面的简化示例中也没有显示,但也可以按预期工作)
上面的命令正是我所期望的。因此,我进入了流程的第二步:一个非常类似的命令,用于删除此范围内的注释行:

sed -i -r "/_start_/,/_end_/ /^#/ d" FileName
但是,这没有任何效果:以
#
开头的行不会被删除。事实上,当我单独执行这个命令时,文件中的任何内容都不会被更改或删除——既不在范围内也不在其他地方

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

有人能告诉我我做错了什么吗

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

您需要更改

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


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

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

正如1_CR所指出的,您可以通过使用块来解决:

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

一个块接受一个地址范围,而每个命令又接受一个地址范围,因此您可以组合regexp。

。非常感谢您的修改和解释!
sed -i -r "/_start_/,/_end_/ {/^#/ d}" FileName