Unix / Linux Bash Scripting:sed不尊重空格

时间:2017-07-12 15:47:11

标签: linux bash unix sed

我正在尝试开发一个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

虽然它添加了不到标志和“听众”完全没问题。

所以我的问题是,我做错了什么?

2 个答案:

答案 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!