2012-06-11 40 views
0

模式時,我有在Shell腳本「的sed」命令的問題,桑達錯誤代可變

我有以下腳本去替代3「標籤」的信息,我從其他2個文件記錄:

#!/bin/sh 

VAR1=$(cat file1.sh | grep --max-count=1 DLC=) 
VAR2=$(cat file1.sh | grep --max-count=1 PROPATH=) 
VAR3=$(cat file2.sh | grep -e -) 

sed 's|PATTERN1|'"$VAR1"'|' <Template.sh> temp1.sh 
sed 's|PATTERN2|'"$VAR2"'|' <temp1.sh> temp2.sh 
sed 's|PROGRESS_CONNECTION|'"$VAR3"'|' <temp2.sh> Final.sh 

注意,3個瓦爾的內容是一樣的字符串(不包括雙引號):

VAR1="DLC=/user/aaa/bbb;export DLC" 
VAR2="PROPATH=/user/ccc/ddd;export PROPATH" 
VAR3="-db docdb -trig triggers -H sona01 -S 19001 -N TCP -ld newyork 
     -db docadm -trig triggers -H sona01 -S 19002 -N TCP -ld docadm 
     -db dochelp -trig triggers -H sona01 -S 19003 -N TCP -ld dochelp 
     -yy 1920 -rereadnolock -T /tmp -c 30 -d mdy -Bt 350 -D 100 -mmax 8192 -nb 200 -s 160 -noshvarfix -inp 32000 
     -cpinternal utf-8 -cpstream utf-8 -cpcoll ICU-UCA" 

當我運行此腳本,temp1.sh是正確創建,temp2.​​sh是正確的CR eated,但不是會創建Final.sh,我得到一個SED錯誤消息:

sed: -e expression #1, char 91: unterminated `s' command 

在這一點上,我不能確定是什麼原因造成了這個問題。

任何幫助?

回答

1

問題是您的$VAR3變量確實包含一些換行符。

$ echo "$VAR3" 
-db docdb -trig triggers -H sona01 -S 19001 -N TCP -ld newyork 
     -db docadm -trig triggers -H sona01 -S 19002 -N TCP -ld docadm 
     -db dochelp -trig triggers -H sona01 -S 19003 -N TCP -ld dochelp 
     -yy 1920 -rereadnolock -T /tmp -c 30 -d mdy -Bt 350 -D 100 -mmax 8192 -nb 200 -s 160 -noshvarfix -inp 32000 
     -cpinternal utf-8 -cpstream utf-8 -cpcoll ICU-UCA 

s///不能包含換行符(除了如果前面由\)。一個解決辦法是用tr -d '\n'刪除換行符:

$ echo "$VAR3" | tr -d '\n' 
-db docdb -trig triggers -H sona01 -S 19001 -N TCP -ld newyork  -db docadm -trig triggers -H sona01 -S 19002 -N TCP -ld docadm  -db dochelp -trig triggers -H sona01 -S 19003 -N TCP -ld dochelp  -yy 1920 -rereadnolock -T /tmp -c 30 -d mdy -Bt 350 -D 100 -mmax 8192 -nb 200 -s 160 -noshvarfix -inp 32000  -cpinternal utf-8 -cpstream utf-8 -cpcoll ICU-UCA 

現在用它在sed:

$ sed 's|PAT|'"$(echo $VAR3 | tr -d '\n')"'|' temp2.sh > Final.sh 
+0

你修好了我的一天。 – EKI