Löschen Sie nachfolgende Kommas in der Zeile


10

Wie lösche ich eine Reihe von nachgestellten Kommas in bash:

a,b,c,d,,,,
1,2,3,,,,

Gewünschte Ausgabe:

a,b,c,d
1,2,3

Versucht dies zu tun:

 grep "5628" test.csv | sed 's/,*$//g'

aber es funktioniert nicht. Die Datei stammte ursprünglich von einem Windows-Computer.


2
Bist du sicher, dass es nicht funktioniert hat? Welchen vollständigen Befehl haben Sie ausgeführt?
Cuonglm

Positiv. Es war nicht so.
user2980702

Können Sie bitte Ihren genauen Befehl angeben (der Befehl, den sedSie ohne Dateinamen angezeigt haben, fungiert als Filter und verarbeitet keine Datei an Ort und Stelle )
Roaima

grep "5628" test.csv | sed 's /, * $ // g'
user2980702

2
Wenn Sie die Datei in * nix verwenden müssen und nicht in der Lage sein müssen, sie zurück nach Windows zu kopieren, ist es auf lange Sicht möglicherweise einfacher, die Zeilenenden von CR / LF nach NL mit dos2unixoder ähnlichem zu konvertieren .
G-Man sagt 'Reinstate Monica'

Antworten:


13

Bezüglich des von Ihnen angegebenen Befehls:

grep "5628" test.csv | sed 's/,*$//g'

Dadurch werden Zeilen ausgegeben, die mit '5628' übereinstimmen, wobei alle nachgestellten Kommas entfernt werden. Die Datei wird nicht aktualisiert test.csv.

Sie haben jedoch angegeben, dass die Datei von einem Windows-Computer stammt, sodass die Zeilenenden CR / NL statt nur NL sind. Das Ergebnis ist, dass sich am Ende der Zeile eine versteckte CR befindet und Sie stattdessen eine Befehlszeile benötigen:

grep "5628" test.csv | sed 's/,*\r*$//'

Eigentlich können Sie dies einfach zu einem Befehl machen:

sed -n '/5628/s/,*\r*$//p' test.csv

Ich versuche nicht, ein Update an Ort und Stelle durchzuführen.
Benötigen Sie

Das hat funktioniert. Vielen Dank. Wir suchen also nach mehreren Kommas (, *) vor dem Wagenrücklauf am Ende der Datei (\ r * $). Habe ich recht ?
user2980702

Dies \r*ermöglicht null oder mehr CR-Zeichen (daher funktioniert es weiterhin mit von Unix / Linux abgeleiteten Dateien). Ich würde es vorziehen, \r?eine einzelne optionale CR anzugeben, aber ich konnte mich nicht an die Flagge erinnern sed, um sie anzuweisen, EREs über meinem Kopf zu verwenden. Ich denke es ist hier -raber ungetestet. Das ,*gehört dir und entspricht null oder mehr Kommas.
Roaima

das gwird in diesem Fall nicht benötigt, ter ist nur 1 Ende angegeben durch$
NeronLeVelu

2
sed -n '/5628/ s/,*\r*$//p' test.csv

(nicht das OP, das nur nach dem Entfernen des nachlaufenden Komas fragt) Dies vermeidet einen Rohrleitungsprozess, bei dem der Filter und die Umwandlung direkt übernommen werden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.