Bash 命令替换两个字符串、多行之间的文本

问题描述 投票:0回答:1

我正在尝试替换文件内两个已知标签之间的多行文本块。它具有以下结构:

#STARTTAG
some text with numbers 123
and dots . that I want 
to replace .
#ENDTAG

我一直在根据我在网上看到的内容尝试不同的方法,包括 sed、awk、perl,但我似乎无法使其工作。

例如,这就是我一直在尝试实现的:

sed -i '' 's/STARTTAG.*ENDTAG/alternative text/g' somefile

但它没有任何作用。我尝试向每个字符串(即标签和替换文本)添加 ' 和 ",但它什么也没做。我不确定我做错了什么。请注意,我希望文本和替代文本都被替换是多行的。

谢谢你

bash text
1个回答
2
投票

我会做什么:

sed '/STARTTAG/,/ENDTAG/{s/.*/alternative text/g;q}' file

产量:

alternative text

sed
是一个面向线流的工具,所以它的目的不是为了更复杂的情况轻松处理多线。

如果您需要保留标签,最好使用

awk
,以免出现复杂且不可读且不可维护的
sed
命令:

awk '$1=="#STARTTAG"{p=1;print;next} $1=="#ENDTAG"{print "alternative text\n"$0}' file

#STARTTAG
alternative text
#ENDTAG

如果您需要即时更改文件,请使用

sponge
(debian)中的
more-utils

awk '...' file | sponge file
© www.soinside.com 2019 - 2024. All rights reserved.