Informatica 命令任务:sed 中的双引号

Informatica command task: double quotes in sed

我需要通过 Informatica 命令 运行 sed 命令。我已经知道 Informatica 通过 sh -c "{command}" 执行命令。但是对于我的情况,我需要 sed 来替换特定的字符串,例如 sed -i 's,xsi:namespace="http://url.example.com",,' file.xml.

我试过用 \ 转义双引号,但没有成功,甚至认为当我直接在 Linux.

中这样做时它会起作用

感谢 Jonathan Leffler's 。我在 Mac 上测试了命令。有关详细信息,请参阅 Jonathan 的评论。

试试这个,对我有用

#!/bin/bash
sed -i '' -e  's,xsi:namespace="http://url.example.com",,' 

这是我的测试和输出:

$ 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",,' 

$ ./test.sh file.xml      

$ cat file.xml
 hello there

真的很棘手。一个似乎有效的版本使用三重反斜杠:

$ bash -c "sed 's,xsi:namespace=\\"http://url.example.com\\",,'" \
> <<< 'abc-xsi:namespace="http://url.example.com"-def'
abc--def
$

第一对代表-c脚本中的反斜杠;反斜杠引号代表 -c 脚本中的双引号。您可以在 bash 之前添加 printf "%s\n" 以查看传递给 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 suggests in his ),是将 sed 脚本或整个 sed 命令放入一个脚本中运行。这避免了 'how many backslashes':

的问题
$ 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 创建 and/or 清理的问题。