我正在寻找有关“sed”命令的示例用法的帮助。我想更改文本文件中部分中变量的值,在此示例中,我想将部分 [aaa] 中 aaa 的值更改为新值,如何使用 sed 或其他命令更改它。
[aaa]
a= b
c= aaa
e = f
[bbb]
a = b
c = aaa
e = f
答案1
尝试:
$ sed '/^\[aaa\]/,/^\[/{/^\[/b; s/aaa/NEW/}' file.ini
[aaa]
a= b
c= NEW
e = f
[bbb]
a = b
c = aaa
e = f
怎么运行的
总体命令如下
/^\[aaa\]/,/^\[/{...}
两个正则表达式以逗号分隔,/^\[aaa\]/,/^\[/
定义了一个行范围,从以 开头的行开始[aaa]
,到以 开头的下一行结束[
。对于该范围内的任何行,但仅有的该范围内的行将执行花括号中的命令。这些命令包括:
/^\[/b
正则表达式
/^\[/
查找以 开头的行。对于这些行,将执行[
命令。代表分支,并告诉 sed 跳过其余命令。b
b
s/aaa/NEW/
对于范围内的任何其他行,这会告诉 sed 用 替换任何出现
aaa
的NEW
。
更详细地说,/^\[aaa\]/
是一个正则表达式,[
其中 是行首的文字,后跟三个,a
后跟文字]
。[
和]
必须用反斜杠转义,因为如果没有反斜杠,[
和]
是正则表达式活动字符。 正则表达式/^\[
匹配以 开头的任何行,[
其中^
是正则表达式活动字符,它匹配行首并\[
匹配文字[
。
答案2
我建议perl
这样做 - 因为它支持就地替换(选项-i
)和段落模式例如
$ perl -00pe 's/aaa/XYZ/g if /^\[aaa\]/' file.ini
[XYZ]
a= b
c= XYZ
e = f
[bbb]
a = b
c = aaa
e = f
如果您只想aaa
在节内进行替换而不是在[aaa]
节标题中进行替换,那么您可以使用环视方法排除后者:
$ perl -00pe 's/(?<!\[)aaa(?!\])/XYZ/g if /^\[aaa\]/' file.ini
[aaa]
a= b
c= XYZ
e = f
[bbb]
a = b
c = aaa
e = f
要执行就地替换:
perl -i -00pe 's/(?<!\[)aaa(?!\])/XYZ/g if /^\[aaa\]/' file.ini