2016-03-24 12 views
1

sedコマンドでコマンドを実行し、Informaticaを実行する必要があります。 Informaticaがsh -c "{command}"でコマンドを実行することはすでに知っています。しかし、私の場合は、sed -i 's,xsi:namespace="http://url.example.com",,' file.xmlのような特定の文字列を置き換えるためにsedが必要です。Informaticaコマンドタスク:sedの二重引用符

私は\で二重引用符をエスケープしようとしましたが、サイコロはありません。Linuxで直接行っても効果があると思っていました。

答えて

0

それは本当にトリッキーです:

は、それが私のために

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

はここに私のテストおよび出力の作品、これを試してみてください。動作しているようです1つのバージョンは、三重のバックスラッシュを使用しています。

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

最初のペアは-cスクリプトでバックスラッシュを表します。バックスラッシュクォートは-cスクリプトの二重引用符を表します。あなたはbashに渡される引数を参照してくださいbashprintf "%s\n"を追加することができます。

$ 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コマンド - 実行するスクリプトに追加します。欠点は、作成および/またはクリーンアップscript.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 
$ 

:これは、「どのように多くのバックスラッシュ」の質問を避けることができます。

+0

私はスクリプトルートを使用しなければなりませんでした。 Informaticaはちょうど協力していなかったし、他のフォーラムの誰もそれを動かさなかった。 – drum

1

ありがとうJonathan Lefflerさんのcommentです。私はMacでコマンドをテストした。詳細については、Jonathanのコメントを参照してください。

$ 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 
+0

Mac(またはBSD)で動作していますか?あなたの 'sed -i '' ... 'の使用はあなたがいることを示唆しています。 GNU 'sed'はMacが' -i 'で実行する効果(バックアップなし)を達成するために '-i'(余分な引数なし)を使用します。唯一の移植可能な記法は、空でないバックアップサフィックスを指定し、それを '-i'オプションに付けます:' -i.bak'。 –