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 清理的问题。
我需要通过 Informatica
命令 运行 sed
命令。我已经知道 Informatica 通过 sh -c "{command}"
执行命令。但是对于我的情况,我需要 sed 来替换特定的字符串,例如 sed -i 's,xsi:namespace="http://url.example.com",,' file.xml
.
我试过用 \
转义双引号,但没有成功,甚至认为当我直接在 Linux.
感谢 Jonathan Leffler's
试试这个,对我有用
#!/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 清理的问题。