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
请注意以下事项(当然,如果我的任何陈述不准确或误导,请告诉我):
- 我使用了
,这样它就可以在位编辑“FileName”,而不是写入其他文件-I
- 我使用了
,这样它就可以识别扩展正则表达式(在上面的简化示例中没有显示,但似乎工作正常)-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