替换为sed不工作

时间:2015-01-14 08:34:52

标签: bash sed

#!/bin/bash
timezone=$(cat /etc/sysconfig/clock | sed 's/ZONE=//g')
sed -i "s/;date.timezone = .*/date.timezone = $timezone/g" /etc/php.ini

当我执行它时,我得到了

  

sed:-e expression#1,char 48:`s'

的未知选项

编辑在我的系统上添加了命令输出**

cat /etc/sysconfig/clock | sed 's/ZONE=//g'
"America/Denver"

最终结果应为

date.timezone = "America/Denver"

2 个答案:

答案 0 :(得分:3)

您的时区变量包含' /'在正则表达式上使用不同的分隔符

例如:@从未在时区中使用过:并且正如@ChrisMaes所说,该文件中可能还有其他您不想要的行。

timezone=$(cat /etc/sysconfig/clock | grep ^ZONE= | sed 's/ZONE=//g')
# thanks Chris
timezone="${timezone//@/\\@}"
# thanks Phillip
sed -i "s@;date.timezone = .*@date.timezone = $timezone@g" /etc/php.ini

答案 1 :(得分:2)

您的timezone变量包含的斜杠比您想要的要多得多。最好添加一行

echo "$timezone"
在你的sed命令之前

首先检查它的内容......

命令的输出

cat /etc/sysconfig/clock | sed 's/ZONE=//g'

给了我/ etc / sysconfig / clock文件的全部内容,只删除了“ZONE =”。所以你的sed表达式将是一个巨大的混乱,因为你的变量timezone包含许多带有许多斜线等的行......

编辑以解决您的问题我建议您使用@Jasen的答案:您可以使用@代替/作为sed的分隔符。