Jak mogę dodać ukośnik odwrotny przed wszystkimi spacjami?

8

Jak mogę wstawić ukośnik odwrotny przed każdą spacją, najlepiej za pomocą poleceń trlub 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
daka
źródło
Czy mógłbyś rozwinąć tę kwestię? Szukasz skryptu, który zmienia plik tekstowy? Czego dokładnie szukasz?
Fabby
tr x ' ', gdzie xjest postać, którą chcesz zastąpić?
Klamka
zaktualizowano - dodano przykład.
daka

Odpowiedzi:

17

trnie można zrobić wielu znaków. Zamiast tego użyj jednego z nich:

  1. sed

    echo "$line" | sed 's/ /\\ /g' 
    

    lub

    sed 's/ /\\ /g' <<< "$line"
    
  2. Perl

    echo "$line" | perl -pe 's/ /\\ /g'  
    

    lub

    perl -pe 's/ /\\ /g'<<< "$line"
    

    Perl ma również wywoływaną ciekawą funkcję, quotemetaktóra może uciec od wszystkich nieparzystych rzeczy w ciągu:

    line='@!#$%^&*() _+"'
    perl -ne 'print quotemeta($_)' <<< $line
    

    Powyższe zostanie wydrukowane

    \@\!\#\$\%\^\&\*\(\)\ _\+\"\
    
  3. Możesz także użyć printfi %q:

    %q  quote the argument in a way that can be reused as shell input
    

    Więc możesz zrobić

    echo "$line" | printf "%q\n" 
    

    Zauważ, że podobnie jak Perl quotemetaucieknie od wszystkich znaków specjalnych, nie tylko spacji.

    printf "%q\n" <<<$line
    
  4. Jeśli masz linię w zmiennej, możesz to zrobić bezpośrednio w bash:

    echo ${line// /\\ }
    
terdon
źródło
tak, to działa, ale nie działa, gdy chcesz zastąpić wszystkie wystąpienia „a” luzem + spacją.
daka
@sudoman Dodałem kilka opcji, ponieważ masz już linię w zmiennej.
terdon
Wbudowana printfwersja Bash ma funkcjonalność podobną do quotemeta- printf '%q\n' "$line"powinna to zrobić IIRC.
evilsoup
4

Jest AWKbrakuje na liście wszystkich możliwych rozwiązań :)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
Sergiy Kolodyazhnyy
źródło