2017-07-12 11 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 

それは完全に罰金記号未満と「リスナー」を追加しながらこれは私が設定した内容です。

私の質問は何ですか、私は間違っていますか? sedのコマンドがどのように見えるように、変数に二重引用符との競合を削除するには、単一引用符の代わりに、sedコマンドで二重引用符を使用して

+0

"$ sedkey" '/ a \' "$ sednew" server-wc.xml' ... sednewの二重引用符があなたのsedコマンドの二重引用符と重複しています – Sundeep

+0

完璧だった、ありがとう! – user3074653

+0

かどうか、スペースは問題を引き起こしていた... @that他の男の答えを参照してください... – Sundeep

答えて

0

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

はあなたにSundeepをありがとう!

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からコピーされました。 sedの代わりにxmlstarletのようなXMLツールを使用することも検討してください。

関連する問題