2016-03-24 24 views
1

numaralı alıntıda çift tırnak işareti sed komutunu Informatica aracılığıyla komut aracılığıyla çalıştırmam gerekiyor. Biliyorum zaten Informatica komutları sh -c "{command}" üzerinden yürütür. Ancak benim durumumda, sed -i 's,xsi:namespace="http://url.example.com",,' file.xml gibi belirli bir dizeyi değiştirmek için sed'e ihtiyacım var.Informatica komut görevi:

\ ile çift tırnaktan kaçmayı denedim, ancak hiçbir zar kullanmıyorum, hatta bunu doğrudan Linux'ta çalıştığımı düşündüm.

cevap

0

Gerçekten zordur:

İşte benim test ve çıkış var benim

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

için çalışır, bu deneyin. iş gibi görünüyor Bir sürümü üçlü ters eğik çizgi kullanır:

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

ilk çifti -c senaryodaki bir ters eğik çizgi temsil eder; ters eğik çizgi işareti, -c komut dosyasında çift tırnak işareti temsil eder.

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

Ancak biraz düşünme ve deneme tek eğik yeterli olduğunu göstermektedir: Sen argümanlar bash geçirilen görmek bash önce printf "%s\n" ekleyebilir Ancak

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

, nasıl görmek zor tek ters eğik çizgi denerken bunu denemedin.

çift ters eğik çizgiler cevap olmadıklarını Not: düşünmeye değer

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

diğer alternatif (ve ne haifzhan onun answer önerdiklerini temelde), sed senaryoyu koymaktır - veya bütün sed komut - çalıştırdığınız bir betiğe. Olumsuz oluşturulan ve/veya temizlenmiş script.sed alma problemleri olabilir

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

: Bu 'kaç ters eğik' sorularını önler.

+0

Komut dizisini kullanmak zorunda kaldım. Informatica sadece işbirliği yapmadı ve diğer forumlarda başka kimse de işe yaramadı. – drum

1

Jonathan Leffler 's için comment için teşekkürler. Mac’te komutu test ettim. Daha fazla bilgi için Jonathan'ın yorumlarına bakın.

$ 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 (veya BSD) üzerinde mi çalışıyorsunuz? 'Sed -i' 'kullanımınız… '' demenizi önerir. GNU 'sed', Mac'nın' -i 'ile başardığı efekti (yedek yok) elde etmek için sadece '-i' (ekstra argüman yok) kullanır. Tek taşınabilir gösterim boş olmayan bir yedekleme sonekini belirtir ve bunu '-i 'seçeneğine ekler:' -i.bak'. –