我正在尝试开发一个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 :(得分:1)
总是引用变量和命令扩展是一种很好的做法,但盲目地在它们左右放置引号不是。
在这种情况下,扩展的引号是不加引号,因为左引号是终止现有的双引号字符串,而右引号则是新引号。例如:
$ ls templates/
bar baz foo test
$ ./gradlew clean allJars
:clean
:jarBar
:jarBaz
:jarFoo
:jarTest
:allJars
BUILD SUCCESSFUL
Total time: 0.615 secs
$ ls ../dist/
bar.jar baz.jar foo.jar test.jar
换句话说,你应该只使用:
(ns browser
(:require
[ajax.protocols :refer [-body]]
...
:response-format {:content-type "image/png"
:type :blob
:description "PNG file"
:read -body}
ShellCheck会自动指出这一点。此信息是从its wiki复制的。另请考虑使用echo "You enter "$HOSTNAME". You can smell the wumpus."
|----------| |---------------------------|
Quoted No quotes Quoted
之类的XML工具,而不是sed -e "/$sedkey/a\\
$sednew" server-wc.xml
。
答案 1 :(得分:0)
在sed命令中使用单引号而不是双引号来删除变量中双引号的冲突,以便sed命令如下所示:
sed '/'"$sedkey"'/a\'"$sednew" server-wc.xml
谢谢Sundeep!