Sed错误:'s'的未知选项

时间:2013-05-03 19:10:57

标签: bash sed

我在bash脚本中有一个sed命令,用一个变量的值替换文件中的第10行。 好的停止混乱(这是我的错,这是完整的脚本:

#!/bin/bash

#Sync timezone between system and php

##get current timezone of system
line=$(head -n 1 /etc/sysconfig/clock)    
timezone=${line:6}

##Set up php date string
time="date_default_timezone_set('${timezone%?}');"
sed -i 10s|.*|$time| test.php

所以时间会有如下值:

date_default_timezone_set( '欧洲/伦敦')

现在给出了这些错误:

> test.php: Permission denied
> date_default_timezone_set('Europe/London);: Not such file or direcotry
> .: .:: is a directory
> sed: -e expression #1. char 3: unterminated 's' command

任何帮助都会很棒,如果您需要更多信息,请告诉我们!

3 个答案:

答案 0 :(得分:1)

time='date_default_timezone_set\("\$timezone"\);'

请注意,我也改变了引号的样式。这是必要的,因为PHP在使用单引号时不会替换变量。

您还可以在引号中附上$ time,但如果$timezone是实际变量,则仍需要双引号:

time='date_default_timezone_set("$timezone");'
sed -i 10s/.*/"$time"/ test.php

根据您对问题的更新,我的理解是您实际上使用的是字符串常量来代替$timezone,因此这可能不适用。在这种情况下,最干净的选择是:

time='date_default_timezone_set("America/New_York");'
sed -i 10s/.*/"${time/\//\\/}"/ test.php

请注意,这需要bash处于“bash”模式,而不是“sh”模式。确保您在任何脚本的顶部都有#!/bin/bash

答案 1 :(得分:1)

遗憾的是,获取时区不是便携式的,但通常/ etc / localtime是指向您时区的符号链接,因此您可以:

tz=$(readlink /etc/localtime | sed 's:\(.*\)/\([^/]*\)/\([^/]*\)$:\2/\3:')
echo ==$tz==

你会得到像==Europe/London==这样的东西。现在你可以构造你的字符串

time="date_default_timezone_set('$tz');"

并在sed中使用它 - 但是不要使用/作为分隔符(因为包含它的时间刺激并且混淆了你的sed)

sed -i "10s:.*:$time:" test.php

答案 2 :(得分:0)

由于timezone包含/字符,您需要做一些特别的事情:

sed -i 10s@.*@$time@ test.php

您可以使用源字符串和目标字符串中未出现的任何字符。在这里,我选择了@