2017-07-12 71 views
0

我想開發一個bash腳本,它將替換/附加配置文件中的一些行。我遇到了一個問題,那就是sed在我的替換行中沒有考慮到空格。這是我設置:Unix/Linux Bash腳本編寫:sed不考慮空格

sedkey="org.apache.catalina.core.ThreadLocalLeakPreventionListener" 
sednew="<Listener\ className=\"org.apache.catalina.mbeans.JmxRemoteLifecycleListener\"\ rmiRegistryPortPlatform=\"7050\"\ rmiServerPortPlatform=\"7051\"\ \/\>" 

sed -e "/"$sedkey"/a\\ 
"$sednew"" server-wc.xml 

但是當我運行含有該腳本,我得到這個:

sed: can't read className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"\: No such file or directory 
sed: can't read rmiRegistryPortPlatform="7050"\: No such file or directory 
sed: can't read rmiServerPortPlatform="7051"\: No such file or directory 
sed: can't read \/\>: No such file or directory 

雖然它增加了超過號和「監聽器」完全正常的少。

所以我的問題是,我做錯了什麼?

+0

嘗試'sed'/'「$ sedkey」'/ a \'「$ sednew」server-wc.xml「...'sednew'中的雙引號與您的sed命令的外雙引號衝突 – Sundeep

+0

非常完美,非常感謝! – user3074653

+0

或者可能不是,空格造成的問題...請參閱@that其他人的回答... – Sundeep

回答

0

在sed命令使用單引號代替雙引號來去除與可變雙引號衝突,使sed命令看起來像:

sed '/'"$sedkey"'/a\'"$sednew" server-wc.xml 

謝謝森迪普•!

1

總是引用變量和命令擴展是很好的做法,但是盲目地將引號左右放置不是。

在這種情況下,擴展周圍的引號沒有引用它,因爲左引號將終止現有的雙引號字符串,而右引號會開始新引號。例如:

echo "You enter "$HOSTNAME". You can smell the wumpus." 
    |----------|   |---------------------------| 
     Quoted No quotes   Quoted 

換句話說,你應該使用:

sed -e "/$sedkey/a\\ 
$sednew" server-wc.xml 

ShellCheck自動指向了這一點。此信息複製自its wiki。另外考慮使用像xmlstarlet這樣的XML工具,而不是sed