¿Cómo escapar de una comilla doble dentro de comillas dobles?

¿Alguien puede mostrarme cómo escapar de la comilla doble dentro de una cadena doble en bash?

Por ejemplo, en mi script de shell

#!/bin/bash dbload="load data local infile \"'gfpoint.csv'\" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY \"'\n'\" IGNORE 1 LINES" 

No puedo obtener CERRADO POR \" con el escape de comillas dobles correctamente. No puedo usar comillas simples para mi variable porque quiero usar la variable $dbtable .

Use una barra invertida:

 echo "\"" # Prints one " character. 

Ejemplo simple de escaping quotes in shell:

 $ echo 'abc'\''abc' abc'abc $ echo "abc"\""abc" abc"abc 

Se hace terminando uno ya abierto ( ' ), colocando uno escapado ( \' ), luego abriendo otro ( ' ).

Alternativamente:

 $ echo 'abc'"'"'abc' abc'abc $ echo "abc"'"'"abc" abc"abc 

Se hace terminando una ya abierta ( ' ), colocando comillas en otra cita ( "'" ), luego abriendo otra ( ' ).

Más ejemplos: escapando comillas simples dentro de cadenas simples entre comillas

No sé por qué este tema antiguo surgió hoy en los listados etiquetados bash, pero por si acaso para los futuros investigadores, tenga en cuenta que puede evitar escaparse utilizando códigos ascii de los caracteres que necesita para hacer eco. Ejemplo:

 echo -e "this is \x22\x27\x22\x27\x22text\x22\x27\x22\x27\x22" this is "'"'"text"'"'" 

\x22 es el código ascii (en hexadecimal) para comillas dobles y \x27 para comillas simples. Del mismo modo, puedes repetir cualquier char.

Supongo que si tratamos de hacer eco de la secuencia anterior con barras diagonales inversas, necesitaremos un desordenado dos filas de eco de barra invertida … 🙂

Para la asignación variable este es el equivalente:

 $ a=$'this is \x22text\x22' $ echo "$a" this is "text" 

Si la variable ya está configurada por otro progtwig, aún puede aplicar comillas dobles / simples con herramientas sed o similares. Ejemplo:

 $ b="just another text here" $ echo "$b" just another text here $ sed 's/text/"'\0'"/' <<<"$b" #\0 is a special sed operator just another "0" here #this is not what i wanted to be $ sed 's/text/\x22\x27\0\x27\x22/' <<<"$b" just another "'text'" here #now we are talking. You would normally need a dozen of backslashes to achieve the same result in the normal way. 

Bash te permite colocar cadenas adyacentes, y terminarán pegadas.

Así que esto:

 $ echo "Hello"', world!' 

produce

 Hello, world! 

El truco es alternar entre cadenas simples y comillas dobles según sea necesario. Desafortunadamente, rápidamente se vuelve muy complicado. Por ejemplo:

 $ echo "I like to use" '"double quotes"' "sometimes" 

produce

 I like to use "double quotes" sometimes 

En tu ejemplo, lo haría algo como esto:

 $ dbtable=example $ dbload='load data local infile "'"'gfpoint.csv'"'" into '"table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"'"'"' LINES "'TERMINATED BY "'"'\n'"'" IGNORE 1 LINES' $ echo $dbload 

que produce el siguiente resultado:

 load data local infile "'gfpoint.csv'" into table example FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "'\n'" IGNORE 1 LINES 

Es difícil ver qué está pasando aquí, pero puedo anotarlo usando comillas Unicode. Lo siguiente no funcionará en bash, es solo para ilustración:

dbload=load data local infile " ‘” 'gfpoint.csv' “‘ " into ‘ ” table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY ' “‘ " ‘” ' LINES “‘ TERMINATED BY " ‘ ” '\n''\n''\n'" IGNORE 1 LINES

Las citas como “”” en lo anterior serán interpretadas por bash. Las comillas como " ' terminarán en la variable resultante.

Si doy el mismo tratamiento al ejemplo anterior, se ve así:

$ echoI like to use"double quotes" “A sometimes

echa un vistazo a printf

 #!/bin/bash mystr="say \"hi\"" 

Sin usar printf

 echo -e $mystr 

salida: decir “hola”

Usando printf

 echo -e $(printf '%q' $mystr) 

salida: decir \ “hola \”

Haga uso de $ “cadena”.

En este ejemplo, sería,

dbload = $ “cargar datos local infile \” ‘gfpoint.csv’ \ “en la tabla $ dbtable CAMPOS TERMINADOS POR ‘,’ CERRADO POR ‘\”‘ LÍNEAS TERMINADAS POR \ “‘\ n’ \” IGNORE 1 LINES ”

Nota (desde la página man ):

Una secuencia de comillas dobles precedida por un signo de dólar ($ “cadena”) hará que la cadena se traduzca de acuerdo con la configuración regional actual. Si la configuración regional actual es C o POSIX, se ignora el signo de dólar. Si la cadena se traduce y reemplaza, el reemplazo se cotiza a doble.

Almacene el carácter de comillas dobles como variable:

 dqt = '"'
 echo "Comillas dobles $ {dqt} X $ {dqt} dentro de una cadena con comillas dobles"

Salida:

 Cita doble "X" dentro de una cadena citada doble

agregue "\" antes de la comilla doble para escapar de ella, en lugar de \

 #! /bin/csh -f set dbtable = balabala set dbload = "load data local infile "\""'gfpoint.csv'"\"" into table $dbtable FIELDS TERMINATED BY ',' ENCLOSED BY '"\""' LINES TERMINATED BY "\""'\n'"\"" IGNORE 1 LINES" echo $dbload # load data local infile "'gfpoint.csv'" into table balabala FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY "''" IGNORE 1 LINES