Comando per eseguire l'escape di una stringa in bash


99

Ho bisogno di un comando bash che convertirà una stringa in qualcosa di cui è stato eseguito l'escape. Ecco un esempio:

echo "hello\world" | escape | someprog

Dove il comando di fuga fa "hello\world"in "hello\\\world". Quindi, someprog può usare "hello\\world"come si aspetta. Naturalmente, questo è un esempio semplificato di ciò che farò davvero.


5
Qual è la natura della fuga? In altre parole, quali personaggi devono essere evitati? Stai cercando una fuga in stile C ++ (dove le tabulazioni sono sostituite da \ t, le nuove righe con \ n, le virgolette con \ ", ecc.)? È difficile aiutare senza che il problema sia ben definito.
Michael Aaron Safyan


Questa domanda potrebbe significare una dozzina di cose diverse. Invece di farci indovinare, sarebbe utile se dicessi esattamente che tipo di fuga stai cercando.
Don Hatch

1
La domanda era specifica per l'utilizzo di \\ per \. C'è una risposta accettata.
Utente1

Risposte:


155

In Bash:

printf "%q" "hello\world" | someprog

per esempio:

printf "%q" "hello\world"
hello\\world

Questo potrebbe essere utilizzato anche tramite variabili:

printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world

6
Intendiamoci, è %qstato rotto per più di un decennio fino al 2012. Aveva problemi con ~. Ci sono anche sed one-liners portatili stackoverflow.com/a/20053121/1073695
Jo So

1
sed è davvero migliore perché può sfuggire anche ai segni del dollaro
untore

2
@untore: a='abc$def":'; printf '%q\n' "$a"risultati in abc\$def\":(il segno del dollaro è sfuggito). Questo è Bash 4.3 (ho ottenuto lo stesso risultato in Bash 3.2). Quale versione stai usando?
In pausa fino a nuovo avviso.

3
per sfuggire al segno del dollaro è sufficiente utilizzare virgolette singole, ad esempio:printf "%q" 'he$l&lo\world'
LeandroCR

bash printf '%q\n' textcita il testo in bashformato (e per la localizzazione corrente), in modo che funzionerebbe solo nel caso dell'OP se someprogavessero la stessa identica sintassi di quotazione bashche è altamente improbabile.
Stephane Chazelas

9

Pure Bash, usa la sostituzione dei parametri:

string="Hello\ world"
echo ${string//\\/\\\\} | someprog

1
in questo modo "ciao mondo" non viene convertito in "ciao \ mondo" - printf aproach nella risposta accettata lo fa.
vchrizz

1
Inoltre, "% q" non esegue l'escape "/" come in "03/25/2017" di cui avevo bisogno per passare a "03 \ / 25 \ / 2017" (in modo che potesse essere in un carattere regolare delimitato da "/" espressione).
Wrlee

0

Puoi usare perl per sostituire vari caratteri, ad esempio:

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

A seconda della natura della tua fuga, puoi concatenare più chiamate per sfuggire ai personaggi appropriati.


1
Perché non sed? $ echo "ciao \ world" | sed 's / \\ / \\\\ /'
Space

1
@ Octopus, anche questa è un'opzione valida. Mi capita di essere più a mio agio con perl, ma sì, funziona anche questo.
Michael Aaron Safyan
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.