我尝试使用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
有效。有人能解释一下原因吗?
答案 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/"
注意:
-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获得该奖项)