Potrzebuję polecenia bash, które skonwertuje ciąg znaków na coś, z czym zostanie usunięty. Oto przykład:
echo "hello\world" | escape | someprog
Gdzie komenda ucieczka czyni "hello\world"
się "hello\\\world"
. Następnie jakiśprog może używać "hello\\world"
zgodnie z oczekiwaniami. Oczywiście jest to uproszczony przykład tego, co naprawdę będę robić.
Odpowiedzi:
W Bash:
na przykład:
Można to również wykorzystać za pomocą zmiennych:
źródło
%q
był zepsuty przez ponad dekadę, aż do około 2012 roku. Miał problemy z~
. Istnieją również przenośne jednokładkowe sedes stackoverflow.com/a/20053121/1073695a='abc$def":'; printf '%q\n' "$a"
daje w wynikuabc\$def\":
(znak dolara jest usuwany ). To jest Bash 4.3 (ten sam wynik uzyskałem w Bash 3.2). Jakiej wersji używasz?printf "%q" 'he$l&lo\world'
printf '%q\n' text
cytuje tekst wbash
formacie (i dla bieżących ustawień regionalnych), więc zadziałałoby to tylko w przypadku OP, gdyby ichsomeprog
składnia cytowania była dokładnie taka sama, jakbash
jest to wysoce nieprawdopodobne.Pure Bash, użyj podstawiania parametrów:
źródło
Możesz użyć perla do zamiany różnych znaków, na przykład:
W zależności od charakteru ucieczki, możesz połączyć wiele wywołań, aby uciec odpowiednim postaciom.
źródło