在文件中test.txt
我有以下文本行
COPYRIGHT (c) 2020 alex4200
我想在其中使用sed
来查找该行并将2020
年替换为2021
年。我尝试了以下表达方式:
sed -i -E "s/COPYRIGHT .*(d{4}) alex4200/2021/" test.txt
但它没有更改文件中的文本test.txt
.我错过了什么?
首先,d
不支持sed
您需要使用[0-9]
。然后你的表达式也不正确(即使你修复了d
它不适用于你尝试的代码),所以我已经根据你显示的示例更正了它。使用您显示的样品,请尝试以下操作。
sed -E 's/^([^ ]* +[^ ]*) +([^s]*) +(.*)$/1 2021 3/' Input_file
一旦您对结果感到满意(将显示在终端上),您就可以使用-i
选项在上面的代码中进行就地保存。
解释:简单的解释是,在替换时使用sed
的反向引用能力。在替换部分的第一部分中,根据所示样本进行 3 个反向引用,其中第二个反向引用将包含 2020 年值,同时进行替换将 2021 年值放在那里。
正则表达式的解释:
^([^ ]* +[^ ]*) ##From starting of value creating 1st back reference which will match values just before 2nd occurrence of space.
+ ##Matching 1 or more occurrences of spaces here.
([^s]*) ##Creating 2nd capturing group which will match everything till space comes, to catch 2020 basically.
+ ##Matching 1 or more occurrences of spaces here.
(.*)$ ##Matching everything till last here and creating 3rd back reference here.
修复 OP 的尝试:
sed -E 's/^(COPYRIGHT .*(c))s+([^ ]*)s+(.*)/1 2021 3/' Input_file
或者要将数字与显示的样本匹配,可以使用以下内容:
sed -E 's/^(COPYRIGHTs+(.*))s+([0-9]{4})(.*)$/1 2021 3/' Input_file