2014-07-01 23 views
40

Come sfuggire a una singola virgoletta in un'espressione sed che è già circondata da virgolette?Come sfuggire alla citazione singola in sed?

Ad esempio:

sed 's/ones/one's/' <<< 'ones thing' 
+2

possibile duplicato del [Sfuggire-apici all'interno delle stringhe racchiuse tra virgolette singole] (http://stackoverflow.com/questions/1250079/escaping-single-quotes-within-single-quoted-strings) – buff

+0

Il corto la risposta è "[non puoi farlo] (http://www.gnu.org/software/bash/manual/bashref.html#Single-Quotes)" - i workaround presentati tutti funzionano bene. –

risposta

71

Citazione sed codici con virgolette doppie:

$ sed "s/ones/one's/"<<<"ones thing" 
    one's thing 

non mi piace sfuggire codici con centinaia di backslash - mi fa male agli occhi Di solito faccio in questo modo:

$ sed 's/ones/one\x27s/'<<<"ones thing" 
    one's thing 
+6

sì, \ x27 è superiore a '\' ' – 4pie0

+1

Questo non sembra funzionare con 'sed -i', nessun motivo particolare? –

+0

@ T.Rex ha funzionato qui con '-i' – Kent

17

Un trucco è quello di utilizzare coperture della stringa di concatenazione di stringhe adiacenti e la fuga la citazione incorporato utilizzando shell fuga:

sed 's/ones/two'\''s/' <<< 'ones thing'

two's thing 

ci sono 3 stringhe nell'espressione sed, che quindi la shell ricuce insieme:

sed 's/ones/two'

\'

's/'

Speranza che aiuta a qualcun altro!

5

Il modo migliore è quello di utilizzare $'some string with \' quotes \''

ad esempio:

sed $'s/ones/two\'s/' <<< 'ones thing' 
+0

Il '$ 'stringa'' in stile C è specifico di Bash, quindi non è portabile alla shell POSIX. – tripleee

0

So che si tratta di andare a suonare come un poliziotto fuori, ma non avrei mai potuto ottenere di lavoro sed quando c'erano le virgolette singole e doppie nella stringa. Per aiutare i neofiti come me che hanno problemi, una possibilità è dividere la stringa. Ho dovuto sostituire il codice in oltre 100 file index.hmtl. Le stringhe avevano virgolette singole e doppie, quindi ho diviso la stringa e sostituito il primo blocco con <!-- e il secondo blocco con -->. Ha fatto un casino dei miei file index.html ma ha funzionato.

1

Basta usare doppie virgolette sull'esterno del comando sed.

$ sed "s/ones/one's/" <<< 'ones thing' 
one's thing 

Funziona anche con i file.

$ echo 'ones thing' > testfile 
$ sed -i "s/ones/one's/" testfile 
$ cat testfile 
one's thing 

Se si dispone di singole e virgolette all'interno della stringa, va bene lo stesso. Basta sfuggire le virgolette.

Ad esempio, questo file contiene una stringa con virgolette singole e doppie. Userò sed per aggiungere una virgoletta e rimuovere alcune virgolette.

$ cat testfile 
"it's more than ones thing" 
$ sed -i "s/\"it's more than ones thing\"/it's more than one's thing/" testfile 
$ cat testfile 
it's more than one's thing