bash - reemplazar caracteres en shell script
¿Cómo puedo evitar las comillas dobles y simples en sed? (8)
Según lo que puedo encontrar, cuando utilizas 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.
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: ¿Podría usar s//"http/:////www/.fubar/./com/"/URL_FUBAR/g
?
¿Realmente escapo de caracteres dentro de las comillas simples?
Con respecto a la comilla simple, vea el código a continuación usado para reemplazar la cadena, let''s
a let us
:
mando:
echo "hello, let''s go"|sed ''s/let''"''"''s/let us/g''
resultado:
hola, vamos a ir
El comando sed
permite usar otros caracteres en lugar de /
:
sed ''s#"http://www.fubar.com"#URL_FUBAR#g''
Las comillas dobles no son un problema.
Es difícil escapar de una sola cita dentro de comillas simples. Prueba esto:
sed "s@[''/"]http://www./([^.]/+).com[''/"]@URL_/U/1@g"
Ejemplo:
$ sed "s@[''/"]http://www./([^.]/+/).com[''/"]@URL_/U/1@g" <<END
this is "http://www.fubar.com" and ''http://www.example.com'' here
END
produce
this is URL_FUBAR and URL_EXAMPLE here
Escapar una comilla doble puede ser absolutamente necesario en sed: por ejemplo, si está utilizando comillas dobles en toda la expresión sed (como debe hacer cuando quiere usar una variable de shell).
Aquí hay un ejemplo que trata de escapar en sed pero también captura algunos otros problemas de cotización en bash:
# cat inventory
PURCHASED="2014-09-01"
SITE="Atlanta"
LOCATION="Room 154"
Digamos que quería cambiar la sala usando un script sed que puede usar una y otra vez, por lo que variabilize la entrada de la siguiente manera:
# i="Room 101" (these quotes are there so the variable can contains spaces)
Este script agregará 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
PD: escribí el guión anterior en varias líneas para hacer los comentarios comparables, pero lo uso como una línea en la línea de comando que se ve así:
i="your location"; if grep -q LOCATION inventory; then sed -i "/^LOCATION/c/LOCATION=/"$i/"" inventory; else echo LOCATION=''"''$i''"'' >> inventory; fi
Mi problema era que necesitaba tener el ""
fuera de la expresión ya que tengo una variable dinámica dentro de la expresión sed en sí misma. Entonces, la solución real es aquella de lenn jackman que reemplaza el "
dentro de la expresión regular sed con [/"]
.
Entonces mi completo bash es:
RELEASE_VERSION="0.6.6"
sed -i -e "s#value=[/"]trunk[/"]#value=/"tags/$RELEASE_VERSION/"#g" myfile.xml
Aquí está:
#
es el separador sed
[/"]
= "
en expresiones regulares
value = /"tags/$RELEASE_VERSION/"
= mi cadena de reemplazo, es importante que solo tenga /"
para las comillas
Necesita utilizar el carácter / "para escapar" (/ escapar del siguiente carácter
sed -i ''s//"http://www.fubar.com/"/URL_FUBAR/g''
Puede ser el "/" char, pruebe este:
sed ''s//"http:////www.fubar.com/"/URL_FUBAR/g''
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%