Cóż, tutaj jest to, co ja przyszedł.
Najpierw dowiedziałem się z ord(), jakie są kody znaków pojedynczych i podwójnych, a następnie użyto składni $ (..), aby przekazać ją do niecytowanego wyrażenia sed. Użyłem XX i yy zamiast pustych łańcuchów. Oczywiście jest to faaar z optymalnego, tj. Być może powinny być połączone w jeden wyraz, zachęcam do eksperymentowania z nim. Istnieje kilka technik, aby uniknąć problemów z cytowaniem, możesz również umieścić wyrażenie sed w oddzielnym pliku, aby uniknąć interpretacji przez powłokę. Podpowiedź ord()/chr() jest również przydatna, gdy próbujesz uporać się z pojedynczymi nieczytelnymi znakami na wyjściu, np. Ciągi UTF na konsoli innej niż UTF.
dtpwmbp:~ pwadas$ echo '"' | perl -pe 'print ord($_) . "\n";'
34
"
dtpwmbp:~ pwadas$ echo "'" | perl -pe 'print ord($_) . "\n";'
39
'
dtpwmbp:~ pwadas$ echo \'\"
'"
dtpwmbp:~ pwadas$ echo \'\" | sed -e s/$(perl -e 'print chr(34) . "\n"')/XX/g | sed -e s/$(perl -e 'print chr(39) . "\n"')/yy/g
yyXX
dtpwmbp:~ pwadas$
EDIT (zauważ, że tym razem, oba znaki są zastępowane przez tego samego łańcucha „yy”). Nie może być niektóre narzędzia powłoki dla znaków „tłumaczenia” do kodów znaków i odwrotnie, to znaczy powinno być możliwe rób to bez użycia perla lub innego interpretera języka.
dtpwmbp:~ pwadas$ echo \'\" | sed -e s/[`perl -e 'print chr(34) . chr(39)'`]/yy/g
yyyy
dtpwmbp:~ pwadas$
a oto jeszcze inny sposób w skorupkach, może nawet prostszy
dtpwmbp:~ pwadas$ X="'"; Y='"' ; echo $X$Y; echo $X$Y | sed -e "s/$X/aa/g;s/$Y/bb/g"
'"
aabb
dtpwmbp:~ pwadas$
@ user2689092 uwaga Rozwiązanie Imane wykorzystuje technikę zastępującą obudowy wyrażeń sed z charakterem arbitrażowym. Możesz użyć na przykład sed -e% aaa% bbb% g ', aby zastąpić go bbb, zakładając, że nie ma "%" w oryginalnym wprowadzeniu. –