如何用 sed 替换正则表达式的一部分?



在文件中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

相关内容

  • 没有找到相关文章