我有文本文件,其中有一个具有如下模式的块:
# 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的回答。