Come posso aggiungere una barra rovesciata prima di tutti gli spazi?


8

Come posso mettere una barra rovesciata prima di ogni spazio, preferibilmente usando tro sedcomandi?

Ecco la mia sceneggiatura:

#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "

Questo dovrebbe sostituire gli spazi con una barra rovesciata seguita da uno spazio, ma sostituisce solo gli spazi con una barra rovesciata e non una barra rovesciata + spazio.

Questo è l'output che ottengo:

hello\bye

Uscita prevista:

hello\ bye

Potresti per favore approfondire un po 'quello? Stai cercando uno script che cambi un file di testo? Che cosa stai cercando esattamente?
Fabby

tr x ' ', dov'è xil personaggio che vuoi sostituire?
Maniglia della porta

aggiornato - esempio aggiunto.
daka,

Risposte:


17

trnon può fare più personaggi. Utilizzare uno di questi invece:

  1. sed

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

    o

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

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

    o

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

    Perl ha anche una funzione elegante chiamata quotemetache può sfuggire a tutte le cose strane in una stringa:

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

    Quanto sopra verrà stampato

    \@\!\#\$\%\^\&\*\(\)\ _\+\"\
    
  3. Puoi anche usare printfe %q:

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

    Quindi, potresti farlo

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

    Nota che questo, come quello di Perl, quotemetasfuggirà a tutti i personaggi speciali, non solo agli spazi.

    printf "%q\n" <<<$line
    
  4. Se hai la linea in una variabile, puoi semplicemente farlo direttamente in bash:

    echo ${line// /\\ }
    

sì, questo funziona, ma non funziona quando si desidera sostituire tutte le occorrenze di "a" con un gioco + spazio.
daka,

@sudoman Ho aggiunto alcune altre opzioni poiché hai già la linea in una variabile.
terdon,

Il printfbuiltin di Bash ha funzionalità simili a quotemeta- printf '%q\n' "$line"dovrebbe farlo IIRC.
evilsoup,

4

C'è AWKmanca nella lista di tutte le possibili soluzioni :)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.