sed正则表达式匹配不起作用

时间:2014-07-13 12:24:24

标签: regex bash sed

我想在许多文件中更新源代码的许可证标题中的年份。 我正在写bash sript。但是 sed 命令无效。特别是,正则表达式无法匹配并替换所需的单词。

示例:mycode.h

<Some Multi Line text>
Copyright 2002-2014 Utkrist Adhikari
<Some Multi Line text>

假设我想在2015年之前取代2014年( END_DATE = 2015 )。我试图用以下命令实现它:

sed -i -r "s/\(Copyright.*\)-[ ]*[0-9]+[ ]*\( Utkrist Adhikari\)/\1$END_DATE\2/" mycode.h

OR

sed '/Copyright/,/Peter Baumann/ {s/-[ ]*[0-9]+[ ]*/$END_DATE/}' $file

基本上,我正在尝试匹配

  • 版权所有 在该行的开头;
  • - [optional_spaces] some_integer [optional_spaces] 介于
  • 之间
  • [one_space] Utkrist Adhikari 在行尾

我想用变量 END_DATE

的内容替换中间部分

3 个答案:

答案 0 :(得分:1)

你可以尝试下面的GNU sed命令,

$ END_DATE=2015; sed -r "s/^(Copyright\s*[0-9]{4}-)[0-9]{4}(\s*Utkrist\s*Adhikari)/\1$END_DATE\2/g" file
<Some Multi Line text>
Copyright 2002-2015 Utkrist Adhikari
<Some Multi Line text>

答案 1 :(得分:1)

sed -r "s/^(Copyright 2002-)[0-9]{4}( Utkrist Adhikari)$/\1$END_DATE\2/" mycode.h

答案 2 :(得分:0)

以下是使用awk

执行此操作的简单方法
awk '/Copyright/ {sub(/-[0-9]*/,"-2015")}1' file
<Some Multi Line text>
Copyright 2002-2015 Utkrist Adhikari
<Some Multi Line text>

当数据来自变量时:

END_DATE=2015
awk -v d="$END_DATE" '/Copyright/ {sub(/-[0-9]*/,"-"d)}1' file
<Some Multi Line text>
Copyright 2002-2015 Utkrist Adhikari
<Some Multi Line text>