使用 sed 有选择地用引号替换字符串

Jos*_*muk 3 command-line sed text-processing

我有一个文件。

$ cat file
"bar":  false
"foo":  false
Run Code Online (Sandbox Code Playgroud)

我需要替换的单词falsetrue仅在图案"foo": false。问题是引号和空格。

我想到了两种方法:

  1. 在某种 qoutes/双引号中隔离整个模式。
  2. 仅替换前面有“foo”的“false”。

2 个选项的示例尝试:

$ sed -i 's/\(.*foo\)/false/true\1/g' file
Run Code Online (Sandbox Code Playgroud)

它失败了。

Zan*_*nna 10

使用地址。如果您单引号您的sed表达式,引号不是问题

$ sed '/"foo"/ s/false/true/' file
"bar":  false
"foo":  true
Run Code Online (Sandbox Code Playgroud)

如果你真的需要匹配整个模式,很好:

$ sed '/"foo": *false/ s/false/true/' file
"bar":  false
"foo":  true
Run Code Online (Sandbox Code Playgroud)

* 匹配任意数量的前一个字符(空格)。

您还可以使用\s匹配制表符(任何水平空白):

sed '/"foo":\s*false/ s/false/true/' file
Run Code Online (Sandbox Code Playgroud)

-i测试后添加选项修改原始文件。