So entfernen Sie ein bestimmtes Zeichen in einer Zeichenfolge, jedoch nur, wenn in dieser Zeile unter Linux keine Zahlen enthalten sind

8

Ich bin mit diesem scheinbar einfach zu behebenden Problem verblüfft. Nun, für eine Weile.

Hier ist eine Beispielausgabe der Datei, die ich bearbeiten muss:

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

Ich muss die Leerzeichen zwischen "George Washington" und "Genfer Konvention" entfernen, aber nicht die Leerzeichen zwischen "123.281.029 USD" oder "342.019.929 EUR".

Im Wesentlichen ist mein Ziel hier, den Abstand zwischen Wörtern in einer Zeile NUR dann zu entfernen, wenn diese Zeile keine Zahlen enthält.

Ich habe versucht, die Datei über zu bearbeiten grep -v [0-9] $file | sed 's/ //', aber das funktioniert nur, wenn ich in eine andere Datei ausgebe. Dies würde jedoch bedeuten, dass alle Zeilen mit Zahlen aus der alten Datei in die neue Datei ausgeschlossen werden, was nicht erforderlich ist.

Ich habe einige ziemlich lächerliche Loops mit grep ausprobiert und sedaber nichts scheint genau richtig zu funktionieren.

Auch hier ist die Beispielausgabe der Datei:

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

Hier ist meine gewünschte Ausgabe:

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

Antworten:

15

Verwenden von sed:

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

Dies würde Leerzeichen in allen Zeilen entfernen, die keine Ziffer enthalten.

Verwenden von awk:

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

Zum Entfernen des Leerzeichens nur zwischen den ersten beiden Wörtern (hier mit GNU sedfür -r, -Estattdessen für BSDs verwenden):

sed -r '/[0-9]/!s/([^ ]+) ([^ ]+)/\1\2/' filename
devnull
quelle
Perfekt! Genau das habe ich gesucht! Die Syntax für den Teil "/ [0-9] /! S /" konnte nirgendwo gefunden werden. Vielen Dank.
user62129
@ user62129 - Wenn diese Antwort Ihr Problem löst, nehmen Sie sich bitte eine Minute Zeit und aktivieren Sie das Häkchen unter der Stimmenzahl links. Dies bedeutet für alle, dass Ihr Problem behoben wurde.
slm
7

Verwenden von perl:

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

Entfernen Sie für einen allgemeineren Ansatz nur die Leerzeichen zwischen zwei Buchstaben. Auf diese Weise kann es auch dann funktionieren, wenn Zeilen Ziffern haben. Die Leerzeichen um die Zahlen werden einfach ignoriert:

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

Das wird zum Beispiel drehen George and Harry 12 EURzu GerogeandHArry 12 EURund nach wie vor richtig für die Fälle , in Ihrem Beispiel arbeiten.

terdon
quelle