¿Cómo reemplazar las comillas en un archivo con sed?

10

Tengo un archivo que contiene varias líneas de xml. Me gustaría reemplazar ciertas partes del archivo. Algunas partes del archivo contienen comillas ( ") que me gustaría reemplazar. He estado tratando de escapar de las comillas \, pero no creo que esto funcione en función del resultado de mi archivo.

Aquí hay un ejemplo de uno de mis comandos sed:

sed -e "s/\"text\"/'text'/ig" file.xml > temp.tmp

¿Es así como escapas de comillas en un comando sed o estoy haciendo algo mal?

jbranchaud
fuente
2
Su comando parece correcto para reemplazar "text"con 'text'. Por supuesto que no hará nada "othertext". Muestre algunas líneas de entrada, la salida no deseada correspondiente, y explique qué salida desea en su lugar.
Gilles 'SO- deja de ser malvado'
Entonces, ¿ \"es la forma correcta de escapar de las comillas en el comando sed?
jbranchaud
44
No es para sed: sed no necesita, ni admite, escapar ". Pero su comando de shell utiliza una cadena entre comillas dobles y \"es correcta allí. El sedprograma ve s/"text"/'text'/igcomo el argumento para -e.
Gilles 'SO- deja de ser malvado'
@Gilles ¿Qué pasa con los espacios? ¿Entiende y respeta los espacios en blanco? Por ejemplo, si mi comando contuviera s/\"text\" /'text'/ig¿Encontraría solo "text" con el espacio después?
jbranchaud
3
Los espacios deben coincidir exactamente. En lugar de continuar este diálogo, le recomiendo que publique alguna entrada de muestra y la salida deseada correspondiente (y tal vez explique por qué necesita cambiar la cita). Ni siquiera está claro cuál sedes la herramienta adecuada para el trabajo, tal vez desee un analizador XML.
Gilles 'SO- deja de ser malvado'

Respuestas:

11

Dos consejos:

  1. No puede escapar de una comilla simple dentro de una cadena entre comillas simples. Por lo tanto, debe cerrar la cotización, agregar una cotización escapada y luego abrir las cotizaciones nuevamente. Es decir 'foo'\''bar', que se desglosa como:

    • 'foo'        citado foo
    • \'             escapado '
    • 'bar'        citado bar

    cediendo foo'bar.

  2. (opcional) No necesariamente tiene que usar /en sed. Encuentro que usar /y \en la misma expresión sed hace que sea difícil de leer.

Por ejemplo, para eliminar las comillas de este archivo:

$ cat /tmp/f
aaa"bbb"'ccc'aaa

Dados mis dos consejos anteriores, el comando que puede usar para eliminar las comillas dobles y simples es:

$ sed -e 's|["'\'']||g'  /tmp/f

Basado en mi primer consejo, el shell reduce el segundo argumento de sed (es decir, la cadena después de -e) s|["']||gy pasa esa cadena a sed. Según mi segundo consejo, sed trata esto igual que s/['"]//g. Significa

eliminar todos los caracteres que coincidan con 'o "   (es decir, reemplazarlos con nada)

Probablemente necesite algo más complejo que esto para hacer lo que quiere, pero es un comienzo.

Yves Junqueira
fuente
1
Para poner un punto más fino en su segundo consejo: puede usar cualquier carácter en lugar de / cuando use los comandos syy, posiblemente entre otros. Cuando se usan expresiones regulares con otros comandos sed, se debe escapar el primer delimitador (si se usa una alternativa a /). Su delimitador preferido también debe escaparse si está intentando hacer coincidirlo dentro de la expresión regular.
Eli Heady
Es difícil mezclar comillas simples y comillas dobles sin ensuciarse. A algunas personas les resulta más fácil leer si cita comillas simples, poniéndolas entre comillas dobles, en lugar de escapar de ellas. Entonces, en lugar de 'foo'\''bar', podríamos usar 'foo'"'"'bar'.
Scott
1

Tengo un puerto de Windows de utilidades Unix, por lo que los comandos se ven un poco diferentes, pero tenía un archivo csv con comas y comillas. Usando este hilo como guía, pude eliminar las comillas a través de este comando:

c:\Temp> cat report.csv | sed "s/\,/\ /g" | sed "s/[""]//g"
JaimeR744
fuente
¡Gracias! estaba atrapado en esto!
Sendbits