我不久前问过类似的问题,但我在让这个问题发挥作用方面遇到了困难。
我正在编写配置文件修改的脚本,如下所示:
[Thing1]
[[subthingA]]
this = 0
that = string
and = localhost
the = 80
other = 0
thing_ading = /path/to/a/dir
[Thing2]
[[subthingB]]
this = 0
thing_ading = /path/to/dir
here = 0
其中有 N 个 [Things],通常具有相同的键和/或键/值对的值,并且 [[subthings]] 下的键/值对正好缩进 8 个空格。我专门尝试使用 awk/sed/grep/tr/cut/perl 制作一个单行代码,它可以将thing_ading
under的值更改SubthingB
为不同的目录路径。
我可以编辑所有内容thing_adings
,并且可以定位某些对,但空格确实给我带来了问题。
答案1
您可以使用sed
范围运算符来解决此类问题,
:
sed -e '
/^\[Thing2]$/,/^$/!b
/^[[:blank:]]\{4\}\[\[subthingB]]/,/^$/s|^\([[:blank:]]\{8\}thing_ading\) = .*|\1 = /YOUR/NEW/PATH/TO/DIR|
' yourinifile
- 首先,您通过跳过不正确的范围来选择正确的范围。
- 然后,当在适当的范围内时,您可以对所需的 thing_ding 变量执行替换。
答案2
这是sed
一句:
sed '/[[subthingB]]/,/^ *\[/{/thing_ading =/s_=.*_= /your/path/_}' config_file
为了仅在subthingB
块上工作,我们处理从缩进后[[subthingB]]
开始到下一行的所有内容。[
现在,对于这个块,我们寻址该thing_ading
行并进行替换,使用_
而不是/
作为s
命令分隔,以避免反斜杠替换导致不可读。
如果subthingB
保证该块有一个thing_ading
条目,您可以简化为
sed '/[[subthingB]]/,/thing_ading =/{//s_=.*_= /your/path/_}'
重用最后一个模式进行内部寻址。