Come rimuovere un carattere specifico in una stringa ma solo se non ci sono numeri in quella linea in Linux


8

Sono stato sconcertato da questo problema apparentemente semplice da risolvere ... beh, per un po '.

Ecco un esempio di output dal file che devo modificare:

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

Devo rimuovere gli spazi tra "George Washington" e "Convenzione di Ginevra", ma non gli spazi tra "123.281.029 USD" o "342.019.929 EUR".

In sostanza, il mio obiettivo qui è quello di rimuovere lo spazio tra le parole in una riga SOLO se non ci sono numeri in quella riga.

Ho provato a modificare il file tramite grep -v [0-9] $file | sed 's/ //', ma l'unico modo per funzionare è se eseguo l'output su un altro file, ma ciò significherebbe escludere tutte le righe con i numeri dal vecchio file al nuovo file, che non è quello di cui ho bisogno.

Ho provato alcuni loop piuttosto ridicoli con grep e sedma nulla sembra funzionare bene.

Ancora una volta, ecco l'output di esempio del file:

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

Ecco l'output desiderato:

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

Risposte:


15

Utilizzando sed:

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

Ciò eliminerebbe gli spazi su tutte le righe che non contengono una cifra.

Utilizzando awk:

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

Per rimuovere lo spazio solo tra le prime due parole (qui usando GNU sedper -r, usare -Einvece su BSD):

sed -r '/[0-9]/!s/([^ ]+) ([^ ]+)/\1\2/' filename

Perfetto! Questo e 'esattamente quello che stavo cercando! Impossibile trovare la sintassi da nessuna parte per la parte "/ [0-9] /! S /". Grazie mille.
user62129

@ user62129 - se questa risposta risolve il problema, ti preghiamo di dedicare un minuto e controllare il segno di spunta sotto il conteggio dei voti a sinistra, questo significherà per tutti che il problema è stato risolto.
slm

7

Utilizzando perl:

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

4

Per un approccio più generale, rimuovere solo gli spazi tra due lettere. In questo modo può funzionare anche se le linee hanno cifre, ignora semplicemente gli spazi attorno ai numeri:

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

Ciò, ad esempio, si trasformerà George and Harry 12 EURin GerogeandHArry 12 EURe continuerà a funzionare correttamente per i casi del tuo esempio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.