2011-09-22 13 views
46

Da quello che riesco a trovare, quando si usano le virgolette singole, tutto è considerato letterale. Lo voglio per la mia sostituzione. Ma voglio anche trovare una stringa che abbia virgolette singole o doppie.Come faccio a evitare le virgolette doppie e singole in SED? (bash)

Per esempio,

sed -i 's/"http://www.fubar.com"/URL_FUBAR/g' 

voglio sostituire "http://www.fubar.com" con URL_FUBAR. Come si suppone che sed abbia riconosciuto il mio // o le mie doppie virgolette?

Grazie per qualsiasi aiuto!

MODIFICA: Posso utilizzare s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g?

Esegue effettivamente \ chars all'interno delle virgolette singole?

risposta

59

Il comando sed permette di altri personaggi invece di /:

sed 's#"http://www.fubar.com"#URL_FUBAR#g' 

Il doppio quo tes non sono un problema.

+0

ottima risposta dood, ho solo una breve domanda. Come potrei fare le virgolette singole al posto dei miei doppi. Ho delle istanze nel mio codice in cui è singolo o doppio. Posso solo eseguire questo comando due volte ma qual è la sintassi per l'escape di una singola citazione? – KRB

+1

O cambiate semplicemente le virgolette in modo da avere, ad esempio, "sed" s # "http: //www.fubar.com'#URL_FUBAR#g" 'o sfuggire alle virgolette singole' sed 's # \' http: //www.fubar.com \ '# URL_FUBAR # g''. – Kusalananda

+0

un genio in divenire - molte grazie :) – danday74

-2

può essere il carattere "\", provate questo:

sed 's/\"http:\/\/www.fubar.com\"/URL_FUBAR/g' 
+1

propone un ipotesi non è una soluzione. è possibile aggiungere tali ipotesi nei commenti invece - o anche meglio - provalo prima – SeriousM

-1

È necessario utilizzare \ "per sfuggire" carattere (\ sfuggire il carattere successivo

sed -i 's/\"http://www.fubar.com\"/URL_FUBAR/g' 
10

È difficile sfuggire a una singola citazione tra virgolette singole. Prova questo:

sed "[email protected]['\"]http://www.\([^.]\+).com['\"]@URL_\U\[email protected]" 

Esempio:

$ sed "[email protected]['\"]http://www.\([^.]\+\).com['\"]@URL_\U\[email protected]" <<END 
this is "http://www.fubar.com" and 'http://www.example.com' here 
END 

produce

this is URL_FUBAR and URL_EXAMPLE here 
5

Il mio problema è che ho bisogno di avere la "" di fuori l'espressione dal momento che ho una variabile dinamica all'interno dell'espressione sed si. Quindi la vera soluzione è quella di Lenn Jackman che si sostituisce il " all'interno della regex con [\"].

Quindi il mio completo bash è:

RELEASE_VERSION="0.6.6" 

sed -i -e "s#value=[\"]trunk[\"]#value=\"tags/$RELEASE_VERSION\"#g" myfile.xml 

Ecco:

# è il separatore sed

[\"] = " in regex valore

= \"tags/$RELEASE_VERSION\" = mia stringa di sostituzione, importante ha solo il \" per le quotazioni

15

Per quanto riguarda la sola citazione, vedere il codice di seguito utilizzato per sostituire la stringa let's con let us:

comando:

echo "hello, let's go"|sed 's/let'"'"'s/let us/g' 

risultato:

ciao, andiamo

+7

perché non sed/s/let/let/g 'funziona? – tarunkt

1

Sfuggire a una doppia quota ca n essere assolutamente necessario in sed: ad esempio, se si utilizzano le virgolette doppie nell'intera espressione sed (come è necessario fare quando si desidera utilizzare una variabile di shell).

Ecco un esempio che tocca fuggire in sed, ma coglie anche alcune altre questioni che citano in bash:

# cat inventory 
PURCHASED="2014-09-01" 
SITE="Atlanta" 
LOCATION="Room 154" 

Diciamo che si voleva cambiare la stanza utilizzando uno script sed che è possibile utilizzare più e più volte, in modo da variablize l'ingresso nel modo seguente:

# i="Room 101" (these quotes are there so the variable can contains spaces) 

Questo script aggiungerà l'intera linea, se non c'è, o sarà semplicemente sostituire (utilizzando sed) la linea che è lì con il testo più il valore del $ i.

if grep -q LOCATION inventory; then 
## The sed expression is double quoted to allow for variable expansion; 
## the literal quotes are both escaped with \ 
    sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory 
## Note the three layers of quotes to get echo to expand the variable 
## AND insert the literal quotes 
else 
    echo LOCATION='"'$i'"' >> inventory 
fi 

P.S. Ho scritto la sceneggiatura di cui sopra su più righe per rendere i commenti che analizzabile, ma lo uso come una battuta sulla riga di comando simile alla seguente:

i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c\LOCATION=\"$i\"" inventory; else echo LOCATION='"'$i'"' >> inventory; fi 
0
Prompt% cat t1 
This is "Unix" 
This is "Unix sed" 
Prompt% sed -i 's/\"Unix\"/\"Linux\"/g' t1 
Prompt% sed -i 's/\"Unix sed\"/\"Linux SED\"/g' t1 
Prompt% cat t1 
This is "Linux" 
This is "Linux SED" 
Prompt% 
+0

Basta usare \ (barra indietro) prima "(virgolette) .. e usare l'opzione -i – SachinH

+1

Sebbene questo snippet di codice sia benvenuto e possa fornire un aiuto, sarebbe [notevolmente migliorato se includesse una spiegazione] (// meta.stackexchange.com/q/114762) di * come * si rivolge alla domanda. Senza di essa, la tua risposta ha un valore educativo molto inferiore - ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo la persona che sta chiedendo ora!Si prega di [modificare] la risposta per aggiungere una spiegazione e fornire un'indicazione di quali limitazioni e ipotesi si applicano. –

Problemi correlati