如何使用 sed 对文本块执行多重替换?

如何使用 sed 对文本块执行多重替换?

我有文本文件,其中有一个具有如下模式的块:

# cat file
Jit .... enabled=false
Jit ..shoes.. From=2021-01-01
Jit ..gloves.. From=2021-01-01

所以我想更改所有这些匹配的正则表达式,用这些行编写一个 sed 文件。

# cat sedfile
/^Jit/ {

    s/enabled=false/enabled=true/g
    s/From=\d+-\d+-\d+/From=2021-02-01/g
}

模式/^Jit/grep 行仅开头吉特和其他步骤进行替换。日期可以是任何内容,所以我无法对它们进行硬编码,因此需要匹配模式。

期望的输出:

Jit .... enabled=false
Jit ..shoes.. From=2021-01-01
Jit ..gloves.. From=2021-01-01

答案1

sed 不知道\d.只需使用标准[0-9]字符类即可:

$ cat sedfile
/^Jit/ {

    s/enabled=false/enabled=true/
    s/From=[0-9]+-[0-9]+-[0-9]+/From=2021-02-01/
}

然后你可以这样做:

line1
Jit .... enabled=false
Jit .... From=2021-01-01
line4

$ sed -Ef sedfile file
line1
Jit .... enabled=true
Jit .... From=2021-02-01
line4

或者,没有脚本文件:

$ sed -E '/^Jit/{s/enabled=false/enabled=true/; s/From=[0-9]+-[0-9]+-[0-9]+/From=2021-02-01/}' file
line1
Jit .... enabled=true
Jit .... From=2021-01-01
line4

我删除了g修饰符,因为您似乎每行只出现一次该模式。

答案2

我提出了一个解决方案,假设(直到更全面的样本输入)线条具有严格的结束模式。如果是这样的话,就不需要更复杂的匹配。

/^Jit/{
  s/false$/true/
  s/[0-9\-]\+$/2021-02-01/
}'

输出:

Jit .... enabled=true
Jit .... From=2021-02-01

关于移除的g标志,请参见@terdon的回答

相关内容