我需要通过sed
命令运行Informatica
命令。我已经知道Informatica通过sh -c "{command}"
执行命令。但是对于我的情况,我需要sed来替换sed -i 's,xsi:namespace="http://url.example.com",,' file.xml
等特定字符串。
我尝试使用\
转义双引号,但没有骰子,甚至认为它直接在Linux中运行时也能正常工作。
答案 0 :(得分:1)
感谢Jonathan Leffler的comment。我在Mac上测试了该命令。有关更多信息,请参阅Jonathan的评论。
试试这个,它对我有用
#!/bin/bash
sed -i '' -e 's,xsi:namespace="http://url.example.com",,' $1
这是我的测试和输出:
$ cat file.xml
xsi:namespace="http://url.example.com" hello there
$ cat test.sh
#!/bin/bash
sed -i '' -e 's,xsi:namespace="http://url.example.com",,' $1
$ ./test.sh file.xml
$ cat file.xml
hello there
答案 1 :(得分:0)
这真的很棘手。一个似乎有用的版本使用三个反斜杠:
$ bash -c "sed 's,xsi:namespace=\\\"http://url.example.com\\\",,'" \
> <<< 'abc-xsi:namespace="http://url.example.com"-def'
abc--def
$
第一对代表-c
脚本中的反斜杠;反斜杠引用表示-c
脚本中的双引号。您可以在printf "%s\n"
之前添加bash
,以查看传递给bash
的参数:
$ printf "%s\n" bash -c "sed 's,xsi:namespace=\\\"http://url.example.com\\\",,'" \
> <<< 'abc-xsi:namespace="http://url.example.com"-def'
bash
-c
sed 's,xsi:namespace=\"http://url.example.com\",,'
$
然而,一点点思考和实验表明单个反斜杠就足够了:
$ printf "%s\n" bash -c "sed 's,xsi:namespace=\"http://url.example.com\",,'" <<< 'abc-xsi:namespace="http://url.example.com"-def'
bash
-c
sed 's,xsi:namespace="http://url.example.com",,'
$ bash -c "sed 's,xsi:namespace=\"http://url.example.com\",,'" <<< 'abc-xsi:namespace="http://url.example.com"-def'
abc--def
$
但是,当你尝试使用单反斜杠时,很难看到你没有尝试过这个。
请注意,双反斜杠不是答案:
$ bash -c "sed 's,xsi:namespace=\\"http://url.example.com\\",,'" <<< 'abc-xsi:namespace="http://url.example.com"-def'
sed: 1: "s,xsi:namespace=\http:/ ...": unterminated substitute in regular expression
$ printf "%s\n" bash -c "sed 's,xsi:namespace=\\"http://url.example.com\\",,'" <<< 'abc-xsi:namespace="http://url.example.com"-def'
bash
-c
sed 's,xsi:namespace=\http://url.example.com\,,'
$
另一个值得思考的替代方案(基本上是haifzhan在他的answer中提出的建议)是放置sed
脚本 - 或整个sed
命令 - 进入你运行的脚本。这避免了“多少反斜杠”的问题:
$ cat script.sed
s,xsi:namespace="http://url.example.com",,
$ sed -f script.sed <<<'abc-xsi:namespace="http://url.example.com"-def'
abc--def
$ bash -c "sed -f script.sed" <<<'abc-xsi:namespace="http://url.example.com"-def'
abc--def
$
缺点可能是创建和/或清理script.sed
的问题。