In einer Textdatei möchte ich ,
(Kommas) und auch "
(Anführungszeichen) entfernen ( nur wenn die doppelten Anführungszeichen durch Kommas getrennte Zahlen enthalten).
56,72,"12,34,54",x,y,"foo,a,b,bar"
Erwartete Ausgabe
56,72,123454,x,y,"foo,a,b,bar"
Hinweis: Ich zeige die obige Zeile nur als Beispiel. Meine Textdatei enthält viele Zeilen wie oben und die durch Kommas getrennten Zahlen in doppelten Anführungszeichen sollten variieren. Das ist,
56,72,"12,34,54",x,y,"foo,a,b,bar"
56,92,"12,34",x,y,"foo,a,b,bar"
56,72,"12,34,54,78,76,54,67",x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar","12,34,54"
56,72,x,y,"foo,a,b,bar","12,34,54","45,57,84,92","bar,foo"
Erwartete Ausgabe:
56,72,123454,x,y,"foo,a,b,bar"
56,92,1234,x,y,"foo,a,b,bar"
56,72,12345478765467,x,y,"foo,a,b,bar"
56,72,x,y,"foo,a,b,bar",123454
56,72,x,y,"foo,a,b,bar",123454,45578492,"bar,foo"
Es gibt eine n
Reihe von Zahlen in doppelten Anführungszeichen, die durch Kommas getrennt sind. Lassen Sie auch die doppelten Anführungszeichen, die Zeichen enthalten, so wie sie sind.
Ich liebe sed
Textverarbeitungswerkzeug. Ich freue mich, wenn Sie eine sed
Lösung dafür veröffentlichen.
text-processing
sed
csv
Avinash Raj
quelle
quelle
56,72,"12,34,54",x,y,"foo,a,b,bar"
zu56,72,123454,x,y,"a,b"
,foo
undbar
heißt verschwinden. Ist es Ihre gewünschte Ausgabe?foo
undbar
) zusammen mit den Kommas entfernt werden. Darüber hinaus verschwinden einige der Zitate dort, wo andere verbleiben. Ganz zu schweigen davon, dass die Kommas zwischena
und auchb
bleiben. Gibt es ein Muster für diese?Antworten:
Dies (von hier aus angepasst ) sollte das tun, was Sie brauchen, obwohl @ Ricis Perl viel einfacher ist:
Erläuterung
:a
: Definieren Sie eine Bezeichnung mit dem Namena
.s/(("[0-9,]*",?)*"[0-9,]*),/\1/
: Dieser muss abgebaut werden(foo(bar))
, sein .\1
foobar
\2
bar
"[0-9,]*",?
: 0 oder mehr von0-9
oder,
, gefolgt von 0 oder 1,
.("[0-9,]*",?)*
: 0 oder mehr der oben genannten übereinstimmen."[0-9,]*
: Match 0 oder mehr von0-9
oder,
die kommen direkt nach a"
ta;
: Gehen Sie zurück zum Labela
und führen Sie es erneut aus, wenn die Ersetzung erfolgreich war.s/""/","/g;
: Nachbearbeitung. Ersetzen""
durch","
.s/"([0-9]*)",?/\1,/g
: Entfernen Sie alle Anführungszeichen um Zahlen.Dies könnte mit einem anderen Beispiel leichter zu verstehen sein:
Während Sie also eine Zahl finden, die direkt nach einem Anführungszeichen steht, gefolgt von einem Komma und einer anderen Zahl, verbinden Sie die beiden Zahlen miteinander und wiederholen Sie den Vorgang, bis dies nicht mehr möglich ist.
An dieser Stelle
info sed
halte ich es für nützlich, ein Zitat aus dem Abschnitt zu erwähnen , der erweiterte Funktionen wie die oben verwendete Bezeichnung beschreibt (danke, dass Sie herausgefunden haben, ob @Braiam):quelle
Wenn Perl in Ordnung ist, gibt es hier eine kurze (und wahrscheinlich schnelle, wenn nicht unbedingt einfache :)) Möglichkeit, dies zu tun:
Das
e
Flag für dens:::
Operator (dies ist nur eine andere Schreibweises///
) bewirkt, dass die Ersetzung als Ausdruck behandelt wird, der jedes Mal ausgewertet wird. Dieser Ausdruck übernimmt die$1
Erfassung aus dem regulären Ausdruck (in dem bereits die Anführungszeichen fehlen) und übersetzt sie (y///
was auch als geschrieben werden kanntr///
), indem/d
alle Kommas gelöscht ( ) werden. Dasr
Flag toy
ist erforderlich, um den Wert als übersetzte Zeichenfolge anstelle der Anzahl der Übersetzungen zu erhalten.Für diejenigen, die sich irgendwie von Perl besudelt fühlen, ist hier das Python-Äquivalent. Python ist wirklich kein Shell-Einzeiler-Tool, aber manchmal kann es zur Zusammenarbeit überredet werden. Folgendes kann als eine Zeile geschrieben werden (im Gegensatz zu
for
Schleifen, die nicht sein können), aber das horizontale Scrollen macht es (noch mehr) unlesbar:quelle
y///
anstatttr///
uns einen weiteren Charakter zu speichern.Für CSV-Daten würde ich eine Sprache mit einem echten CSV-Parser verwenden. Zum Beispiel mit Ruby:
quelle
Hallo, hier ist der Python- Code zum Ersetzen von Kommas in doppelten Anführungszeichen. Kommas werden durch Pipe-Zeichen (|) ersetzt
Dieser Python-Code ersetzt Kommas in doppelten Anführungszeichen
zB: x, y, z, 1,2, "r, e, t, y", h, 8,5,6
wenn durch Rohr x, y, z, 1,2, "r | e | t | y", h, 8,5,6 ersetzen
wenn durch null x, y, z, 1,2, "rety", h, 8,5,6 ersetzen
quelle