Cómo eliminar un carácter específico en una cadena pero solo si no hay números en esa línea en Linux

8

He quedado perplejo con este problema aparentemente fácil de solucionar ... bueno, por un tiempo.

Aquí hay un ejemplo de salida del archivo que necesito editar:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

Necesito eliminar los espacios entre "George Washington" y "Convención de Ginebra", pero no los espacios entre "123,281,029 USD" o "342,019,929 EUR".

Esencialmente, mi objetivo aquí es eliminar solo el espacio entre las palabras en una línea SOLAMENTE si no hay números en esa línea.

Intenté editar el archivo a través de grep -v [0-9] $file | sed 's/ //', pero la única forma en que funcionará es si salgo a otro archivo, pero eso significaría excluir todas las líneas con números del archivo anterior al archivo nuevo, que no es lo que necesito.

He probado algunos bucles bastante ridículos con grep y sedparece que nada funciona bien.

De nuevo, aquí está el resultado de ejemplo del archivo:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

Aquí está mi salida deseada:

$cat file
GeorgeWashington
GenevaConvention
123,281,029 USD
342,019,929 EUR
usuario62129
fuente

Respuestas:

15

Utilizando sed:

sed '/[0-9]/!s/ //g' filename

Esto eliminaría espacios en todas las líneas que no contienen un dígito.

Utilizando awk:

awk '!/[0-9]/{gsub(" ", "", $0)};1' filename

Para eliminar el espacio solo entre las dos primeras palabras (aquí usando GNU sedpara -r, use -Een su lugar en BSD):

sed -r '/[0-9]/!s/([^ ]+) ([^ ]+)/\1\2/' filename
devnull
fuente
¡Perfecto! ¡Esto es exactamente lo que estaba buscando! No se pudo encontrar la sintaxis en ningún lugar para la parte "/ [0-9] /! S /". Muchas gracias.
user62129
@ user62129: si esta respuesta resuelve su problema, tómese un minuto y verifique la marca de verificación debajo del conteo de votos a la izquierda, esto significará para todos que su problema ha sido resuelto.
slm
7

Utilizando perl:

perl -ple 's/\s+//g unless /\d/' file
Cuonglm
fuente
4

Para un enfoque más general, elimine solo aquellos espacios que están entre dos letras. De esa manera puede funcionar incluso si las líneas tienen dígitos, simplemente ignora los espacios alrededor de los números:

perl -pe 's/([a-z])\s+([a-z])/$1$2/ig' file

Esa voluntad, por ejemplo, girar George and Harry 12 EURa GerogeandHArry 12 EURy todavía funciona correctamente para los casos en que su ejemplo.

terdon
fuente