sed错误:未知选项's'

问题描述:

我有一个bash脚本中的sed命令,用一个变量的值替换文件中的第10行。 确定以停止confustion(这是我的错,这里是完整的脚本:sed错误:未知选项's'

#!/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 

任何帮助将是巨大的,如果你需要任何更多的信息让我知道

+0

,它将取代整条生产线'$ time'。你不是只想替换部分行,比如'$ timezone'? – Zenexer 2013-05-03 19:13:28

+0

是的另一种选择是将行保留在test.php中,并只更新$ timezone的部分。我不确定如何做到这一点,所以只是做了整个线路,但如果你能做到这一点,那将是很大的 – 2013-05-03 19:14:30

+0

这将用'$ time'替代整个线路。你只需要用'$ time'在你的PHP文件中有一行。通常,这是无效的PHP。 - 哦,等等,我明白了...... – Zenexer 2013-05-03 19:15:31

由于timezone包含/字符,你需要做一些特别的东西:

sed -i [email protected]*@[email protected] test.php 

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

+0

谢谢你,虽然上述所有方法都可以工作,但这是我与 – 2013-05-04 11:41:46

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

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

你也可以用引号括起来$时间,但如果$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 

注意,这需要庆典是在“打击”模式,而不是“sh”的模式。确保你有#!/bin/bash在任何脚本的顶部。

+0

hm。我得到了奇怪的错误:'sed:1:“test.php”:undefined label'est.php'' 通过运行上述代码 – kobame 2013-05-03 19:43:04

+0

@kobame哪一组代码?所有这一切都适合我。 – Zenexer 2013-05-03 19:48:45

+0

最后两行,用'sed -i 10s /.*/“$ {time/\ // \\ /}”/ test.php' - 我把这两个文件放入一个myscript文件中,并作为'bash myscript' - 我的test.php只包含20行数字 – kobame 2013-05-03 20:07:23

为了得到时区是不幸的是没有可移植的,但通常在/ etc /本地时间是一个符号链接到你的时区,所以您可以:

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 
+0

一起使用的方法。如果你的字符串变成了冒号,会发生什么? – Zenexer 2013-05-03 19:32:12

+0

但理论上,随着代码的变化,有人可能会添加该字符。逃避一切通常是一个更好的主意。 – Zenexer 2013-05-03 19:35:55

+0

当然 - 你是正确的:) – jm666 2013-05-03 19:36:39