script reemplazar caracteres bash command-line sed

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%