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.