如何仅更改文件某个部分中变量的值?

如何仅更改文件某个部分中变量的值?

我正在寻找有关“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],到以 开头的下一行结束[。对于该范围内的任何行,但仅有的该范围内的行将执行花括号中的命令。这些命令包括:

  1. /^\[/b

    正则表达式/^\[/查找以 开头的行。对于这些行,将执行 [命令。代表分支,并告诉 sed 跳过其余命令。bb

  2. s/aaa/NEW/

    对于范围内的任何其他行,这会告诉 sed 用 替换任何出现aaaNEW

更详细地说,/^\[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

相关内容