2011-09-22 8 views
46

Según lo que puedo encontrar, cuando se usan comillas simples, todo lo que está dentro se considera literal. Quiero eso para mi sustitución. Pero también quiero encontrar una cadena que tenga comillas simples o dobles.¿Cómo puedo evitar las comillas dobles e individuales en SED? (bash)

Por ejemplo,

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

quiero reemplazar "http://www.fubar.com" con URL_FUBAR. ¿Cómo se supone que sed reconoce mi // o mis comillas dobles?

¡Gracias por cualquier ayuda!

EDITAR: ¿Pude usar s/\"http\:\/\/www\.fubar\.\com\"/URL_FUBAR/g?

¿Realmente escapo de los caracteres dentro de las comillas simples?

Respuesta

59

El comando sed permite que a otros personajes en lugar de /:

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

La doble quo tes no son un problema.

+0

excelente respuesta, solo tengo una pregunta rápida. ¿Cómo puedo hacer comillas simples en lugar de mis dobles? Tengo instancias en mi código donde es simple o doble. Solo puedo ejecutar este comando dos veces, pero ¿cuál es la sintaxis para escanear una sola cita? – KRB

+1

Simplemente cambie las comillas para que tenga, por ejemplo, 'sed 's #' http: //www.fubar.com'#URL_FUBAR#g" 'o escape las comillas simples' sed 's # \' http: //www.fubar.com \ '# URL_FUBAR # g''. – Kusalananda

+0

un genio en ciernes - muchas gracias :) – danday74

-2

puede ser el char "\", prueba este:

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

propone una suposición no es una solución. puede agregar tales conjeturas en comentarios en su lugar, o mejor aún, probarlo primero – SeriousM

-1

Necesita utilizar \ "para escapar de" carácter (\ escapar el siguiente carácter

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

Es difícil escapar de una sola cita entre comillas simples. Prueba esto:

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

Ejemplo:

$ 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

Mi problema era que tenía que tener el "" fuera de la expresión ya que tengo una variable dinámica dentro de la expresión sed sí mismo. Así que la solución real es aquella de Lenn Jackman que reemplaza el " dentro de la sed de expresión regular con [\"].

Así que mi completa Bash es:

RELEASE_VERSION="0.6.6" 

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

aquí es:

# es el separador de sed

[\"] = " en expresiones regulares valor

= \"tags/$RELEASE_VERSION\" = mi cadena de reemplazo, importante tiene solo el \" para las cotizaciones

15

En cuanto a la comilla simple, ver el código de abajo se utiliza para reemplazar la cadena let's con let us:

comando:

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

resultado:

hola, vamos adelante

+7

¿por qué no sed/let \ 's/let/g' work? – tarunkt

1

Escapar una comilla doble ca n absolutamente necesario en sed: por ejemplo, si está utilizando comillas dobles en toda la expresión sed (como debe hacer cuando quiera usar una variable de shell).

Aquí hay un ejemplo que toca en escapar de sed, sino también recoge algunas otras cuestiones citando en bash:

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

Digamos que usted quiere cambiar el ambiente usando una secuencia de comandos sed que puede utilizar una y otra vez, por lo que variablize la entrada de la siguiente manera:

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

Este script se sumará toda la línea si no está allí, o simplemente reemplazará (usando sed) la línea que está allí con el texto más el valor de $ 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. Escribí el guión anterior en varias líneas para que los comentarios apta para su procesamiento, pero lo uso como una sola línea en la línea de comandos que se parece a esto:

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

Simplemente use \ (barra invertida) antes de "(comillas dobles) .. y use la opción -i – SachinH

+1

Si bien este fragmento de código es bienvenido, y puede proporcionar alguna ayuda, sería [mejorado en gran medida si incluyera una explicación] (// meta.stackexchange.com/q/114762) de * cómo * aborda la pregunta. Sin eso, tu respuesta tiene mucho menos valor educativo: recuerda que estás respondiendo la pregunta a los lectores en el futuro, ¡no solo a la persona que pregunta ahora!Por favor [edite] su respuesta para agregar una explicación y dar una indicación de qué limitaciones y suposiciones se aplican. –

Cuestiones relacionadas