2013-05-03 120 views
1

我有一個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

回答

0

由於timezone包含/字符,你需要做一些特別的東西:

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

您可以使用不會出現在你的源和目標字符串的任何字符。這裏我選擇了@

+0

謝謝你,雖然上述所有方法都可以工作,但這是我與 – 2013-05-04 11:41:46

1
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

1

爲了得到時區是不幸的是沒有可移植的,但通常在/ 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