Jak mogę wstawić ukośnik odwrotny przed każdą spacją, najlepiej za pomocą poleceń tr
lub sed
?
Oto mój skrypt:
#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "
Ma to zastąpić spacje odwrotnym ukośnikiem, a następnie spacją, ale zastępuje spacje odwrotnym ukośnikiem, a nie odwrotnym ukośnikiem + spacja.
To jest wynik, który otrzymuję:
hello\bye
Oczekiwany wynik:
hello\ bye
tr x ' '
, gdziex
jest postać, którą chcesz zastąpić?Odpowiedzi:
tr
nie można zrobić wielu znaków. Zamiast tego użyj jednego z nich:sed
lub
Perl
lub
Perl ma również wywoływaną ciekawą funkcję,
quotemeta
która może uciec od wszystkich nieparzystych rzeczy w ciągu:Powyższe zostanie wydrukowane
Możesz także użyć
printf
i%q
:Więc możesz zrobić
Zauważ, że podobnie jak Perl
quotemeta
ucieknie od wszystkich znaków specjalnych, nie tylko spacji.Jeśli masz linię w zmiennej, możesz to zrobić bezpośrednio w bash:
źródło
printf
wersja Bash ma funkcjonalność podobną doquotemeta
-printf '%q\n' "$line"
powinna to zrobić IIRC.Jest
AWK
brakuje na liście wszystkich możliwych rozwiązań :)źródło