匹配模式并替换其后面的第一个字符串实例(无论空格或制表符)

匹配模式并替换其后面的第一个字符串实例(无论空格或制表符)

我不久前问过类似的问题,但我在让这个问题发挥作用方面遇到了困难。

我正在编写配置文件修改的脚本,如下所示:

[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_adingunder的值更改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/_}'

重用最后一个模式进行内部寻址。

相关内容