Ersetze jedes Komma, das nicht in doppelte Anführungszeichen eingeschlossen ist, durch '|' [geschlossen]

8

Ich möchte jedes Komma, das nicht in doppelten Anführungszeichen steht, durch '|' ersetzen Verwenden von Mustererkennung innerhalb von

loganaayahee 20.11.2012, 14:38
quelle

4 Antworten

12

Erstes Beispiel: Schnell und schmutzig:

Wenn Ihrem Komma IMMER ein Leerzeichen in Textzeichenfolgen folgt und NIE in Feldtrennung, können Sie Folgendes verwenden:

%Vor%

aber Sie müssen sicher über nächstes Zeichen sein.

Mehr ausgearbeitete Beispiele ohne Platzbedarf, die Ihrer ursprünglichen Idee am nächsten kommen.

%Vor%

Erklärt:

%Vor%
  • :a ist ein Adressort für die Verzweigung (Schleife)
  • s/ suche vom Anfang der Zeile nach '[^',] *, 'oder' "...", dann ersetze Komma durch vbar.
  • ta Zweig zu einem wenn vorherige s/ wurden gefunden.

Wenn Sie angefordert haben, auf Zeile 2 zu operieren, müssen Sie:

%Vor%

Bearbeitet: [FALSCH! Siehe Bearbeiten 3 ]

Noch ein Beispiel, wenn Sie Zitate und Anführungszeichen gemischt haben möchten:

Es gibt ein Beispiel mit gemischt zitierten, nicht zitierten und einem Feld enthält ein Zitat, aber doppelt zitiert :

%Vor%

wo sed Skript könnte in einer etwas leserlicheren Skriptdatei wie folgt eingeschränkt werden:

%Vor%

Erklärt:

s/ Suche nach Zitat oder Doppelzitat ['"] als dritter eingeschlossener Regex-Teil, gefolgt von 0 oder mehr anderes Zeichen als mathing third enclosed part , schließlich gefolgt von einem zweiten Zeichen wie dritter Regexteil ... ODER kein Koma, einzelnes oder doppeltes Zitat [,'"] ...

Bearbeiten 3 Warnen! Das war Falsch! :

Also richtige Antwort scheint definitiv etwas wie:

%Vor%

Sie konnten meinen Fehler beim Hinzufügen von ;L zum Debuggen vor ta :

sehen %Vor%

wo

%Vor%

wir können sehen, dass dies nicht so einfach ist ... [^] gibt keinen beabsichtigten Effekt, sondern passt auf nicht char 3 .

Schließlich müssen wir nach jedem Begrenzer für sich suchen:

%Vor%

Nota: Von dort zeige ich csv2tsv als Koma auf Tab-getrennte Werte , wenn Sie wirklich | pipe als Trennzeichen verwenden möchten, könnten Sie Ersetzen Sie \t durch | oder ein beliebiges Zeichen, das Sie möchten.

well command line ist weniger sexy:

%Vor%

Aber das entspricht der Notwendigkeit.

%Vor%

Erstellen Sie sedscript :

%Vor%

Jetzt:

%Vor%     
F. Hauri 20.11.2012, 14:54
quelle
7

Hier ist eine Möglichkeit, mit GNU awk und der FPAT Variable:

%Vor%

Ergebnisse:

%Vor%     
Steve 20.11.2012 15:43
quelle
4
%Vor%     
Ed Morton 21.11.2012 16:59
quelle
2

Wenn es sich nicht um eine Lernübung über sed handelt, würde ich eine Sprache mit einem geeigneten CSV-Parser verwenden, zum Beispiel:

%Vor%

Ausgaben

%Vor%

Die Zitate sind verschwunden. Das liegt daran, dass es keine "inneren" Trennzeichen gibt, die zitiert werden müssen. Wenn in der Eingabe einige Pipes angezeigt werden, werden einige Felder in der Ausgabe doppelt angegeben.

    
glenn jackman 20.11.2012 17:01
quelle

Tags und Links