Estoy trabajando con la .csvsalida de esta consulta de datos SE que se ve así (solo con 5022 entradas):
"{
""id"": 281952,
""title"": ""Flash 11.2 No Longer Supported by Google Play""
}"
"{
""id"": 281993,
""title"": ""Netbeans won't open in Ubuntu""
}"
(Y tiene ^Mterminaciones de línea entre [número] y "" título ""). Necesito que se vea así:
281952,Flash 11.2 No Longer Supported by Google Play
281993,Netbeans won't open in Ubuntu
Lo arreglé en un editor de texto determinado que permanecerá sin nombre con bastante facilidad, pero quería crear un script para no tener que volver a hacerlo cada vez que se actualiza la consulta y para que otros puedan usarla. Yo solía sed...
Esta serie de comandos funciona perfectamente (aunque puede ser ineficiente; es solo una solución de prueba y error):
# Print the ^M and remove them, write to a new file:
cat -v QueryR* | sed 's/\^M//' > QueryNew
# remove all the other junk:
sed -i 's/{//' QueryNew
sed -i 's/}//' QueryNew
sed -i 's/""//g' QueryNew
sed -i 's/^"//' QueryNew
sed -i '/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}' QueryNew
sed -i 's/^\s\+//' QueryNew
sed -i '/^\s*$/d' QueryNew
sed -i 's/^id:\ //' QueryNew
sed -i 's/,\ /,/' QueryNew
sed -i 's/\\//g' QueryNew
Entonces, ¿por qué no esto? Sólo el ^My {}se eliminan, y todo lo demás es todavía allí.
#!/bin/bash
cat -v QueryR* | sed 's/\^M//' > QueryNew
sed -i '{
s/{//
s/}//
s/""//g
s/^"//
/,/{N;/\n.*title:\s/{s/,\n.*title:\s/,\ /}}
s/^\s\+//
/^\s*$/d
s/^id:\ //
s/,\ /,/
s/\\//g
}' QueryNew
Estoy seguro de que mi error es realmente obvio ...
fuente

\r.jqse rompió en la primera línea donde el campo del título tenía dos puntos (la primera línea). Todavía no estoy seguro de por quésedme odia, pero Maté a algunas de las citas y\ren esta línea/,\r*/{N;/\n.*title.*:\s/{s/,\r*\n.*title.*:\s/,\ /}}y, finalmente, que funciona como este . Muchas gracias ^ _ ^sed -rn -e 's/\"\"//g' -e 's/^(.*): (.*)\r$/\2/p' QueryR* | paste -d '' - -y hecho como magia)Lo arreglé gracias a Steeldriver y otros ajustes. Sin refinar pero funciona.
traducción:
s/"{//Eliminar"{s/}"//Eliminar}"s/^"//Eliminar"del inicio de la/,\r/{N;/\n.*title.*:\s/{s/,\r\n.*title.*:\s/,\ /}}coincidencia de línea,\ren una línea y[whatever]title[whatever]:en la siguiente línea, reemplazar todo eso con,s/""//gEliminar todas las comillas dobles dobles restantess/^\s\+//Eliminar el espacio en blanco del inicio de las líneas/^\s*$/dEliminar las líneas vacíass/^id:\ //Eliminarid:y dejar espacio después de esos/\\//gEliminar las barras invertidas (caracteres de escape para "agregado a algunos campos de título)tee "$1"especifica un archivo de salida cuando se ejecuta el script, por ejemplo./queryclean newquery.csvfuente
Si bien la pregunta lo solicita
sed, uno podría solucionar los problemas de sed con Python:Este código es compatible con python2 y python3, por lo que cualquiera funcionará
Ejecución de muestra:
fuente
Tres enfoques más:
awk
Perl
GNU grep con expresiones regulares compatibles con perl y perl simple:
fuente
Esto no es exactamente responder a su pregunta o resolver su problema, pero para deshacerse de los caracteres no deseados puede usar tr :
y obtendrás:
fuente
tr:)Este es otro guión escrito en Ruby. Retendrá las comas en el título, que pueden importarse fácilmente a cualquier programa de hoja de cálculo sin romper las columnas.
Después de ejecutar el programa, la salida producida se verá así
fuente
:dentro de ellos?