SeD正则表达式替换

时间:2014-01-03 18:11:02

标签: linux shell sed

我尝试使用sed在配置文件中进行非常简单的替换: 文件中的行是:

    local startday=os.time{year=2014, month=01, day=02, hour=00}

我想从bash脚本中读取年/月/日并在此文件中替换它们,但即使是最简单的sed命令也无法工作。我想的是:

sed -e '/day=/ s/=[0-9]{2}/=$DAY_FROMSCRIPT/' configfile

但有趣的是,如果我指定:

sed -e '/day=/ s/=02/=$DAY_FROMSCRIPT/' configfile

有效。有人能解释一下原因吗?

3 个答案:

答案 0 :(得分:1)

您的原始命令有几个错误:

  • 花括号必须转义\{,否则你必须使用扩展正则表达式(Linux上为-r
  • 你必须在正则表达式中使用day=,否则替换也会匹配month=
  • 您必须使用双引号,以便变量扩展$DAY_FROMSCRIPT正常工作

代码:

sed "s/day=[0-9]\{2\}/day=$DAY_FROMSCRIPT/" configfile

如果您还要替换月份和年份,只需在管道中连接sed命令:

sed "s/day=[0-9]\{2\}/day=$DAY_FROMSCRIPT/" configfile |
sed "s/month=[0-9]\{2\}/month=$MONTH_FROMSCRIPT/" |
sed "s/year=[0-9]\{2\}/year=$YEAR_FROMSCRIPT/"

注意:

  • sed -e选项不是必需的
  • /day=/地址部分也不是必需的,因为您在sed s命令中指定它

答案 1 :(得分:0)

更换日,月,年:

sed -e "/startday=/ s/day=[0-9]\{2\}/day=$day/" \
    -e "/startday=/ s/month=[0-9]\{2\}/month=$month/" \
    -e "/startday=/ s/year=[0-9]\{4\}/year=$year/"

您的简单正则表达式不起作用,因为sed使用基本正则表达式(称为BRE),您必须将{...}写为\{...\}

如果您使用的是GNU sed,则可以使用-r标志启用扩展正则表达式,并按以下方式编写:

sed -r -e "/startday=/ s/day=[0-9]{2}/day=$day/" \
    -e "/startday=/ s/month=[0-9]{2}/month=$month/" \
    -e "/startday=/ s/year=[0-9]{4}/year=$year/"

如果是BSD sed,则可以使用-r标记代替-E标记。

另一件事,我使用/startday=/作为搜索模式更严格。如果这是不必要的,因为您只有一行符合模式day=month=year=,那么您可以省略搜索模式,如下所示:

sed -e "s/day=[0-9]\{2\}/day=$day/" \
    -e "s/month=[0-9]\{2\}/month=$month/" \
    -e "s/year=[0-9]\{4\}/year=$year/"

答案 2 :(得分:0)

这个怎么样?:

sed -e 's/day=[0-9]\+/day='"$FROMSCRIPT"'/' \ 
    -e 's/month=[0-9]\+/month='"$FROMSCRIPT"'/' \ 
    -e 's/year=[0-9]\+/year='"$FROMSCRIPT"'/' \
configfile 

您需要确保$FROMSCRIPT变量不包含有问题的内容 - 例如分隔符 - 这会破坏sed模式。只要它们包含数字,它就应该没问题。

s/命令前面的正则表达式条件不是必需的,因为您已在替换正则表达式中指定了该条件。 (感谢@Tomas获得该奖项)