2017-02-17 1 views
0

Ich habe eine Datei, die ich verarbeite und hängen geblieben Format ist wie folgt: "HostRecord", "SOMEFILE", "InsideView", "legacy.name.com", "1.2.3.4" „1.2.3.5“, „some comment“, „“Entfernen von Anführungszeichen zwischen zwei Strings

ich brauche das entfernen „“ zwischen den IP-Adressen, aber die , so am Ende verlassen würde ich die Ausgabe aussieht wie diese: „HostRecord "," SOMEFILE "," InsideView "," legacy.name.com "," 1.2.3.4,1.2.3.5 "," irgendein Kommentar "," "

Ich dachte, ich benutze einfach sed und habe mehrere versucht Dinge. Mein letztes ist so etwas wie diese:

sed -e 's/\(.*[0-9]\{1,3\}=1&\)\"\(,=2&\)\"\([0-9]\{1,3\}=3&\)/\1\2\3/' 

, die keine Wirkung auf alle, nicht wirklich pingelig auf einem bestimmtes Werkzeug zu haben scheint, die Arbeit zu tun, brauche ich nur, um es fertig gestellt. Hat jemand irgendwelche Gedanken?

+0

Wenn sich die IP immer in der gleichen relativen Position befindet, greifen Sie auf diese Elemente nur gezielt zu und entfernen Sie manuell die "? z.B. 'liste [4] = liste [4] [: - 1]; Liste [5] = Liste [5] [1:] '. – PrestonH

+0

So etwas Klarheit nehme ich an, könnte helfen, die Datei ist etwa 200k Zeilen lang, und nicht alle Einträge haben mehrere IPs und einige Zeilen haben Dutzende von IPs. Was ich tun wollte, war nur eine schnelle Musterübereinstimmung zwischen dem letzten Oktett der "," und dem ersten Oktett der nächsten IP zu machen und nur die "out – Elmore

+0

" auszublenden. Also woher weißt du, wann die IPs aufhören? –

Antwort

0

Warum nicht etwas verwenden, das echte CSV-Verarbeitung hat? Vorausgesetzt, dass Sie die IP-Adressen sammeln, bis Sie etwas, das nicht Blick wie eine IP-Adresse hat, sollte diese Arbeit:

ruby -rcsv -e ' 
    cout = CSV.new $stdout, force_quotes: true 
    CSV.new(ARGF).each do |row| 
    out_row = row.shift(4) 
    ips = row.shift 
    while row[0] =~ /^\d+\.\d+\.\d+\.\d+$/ 
     ips += ",#{row.shift}" 
    end 
    cout << out_row + [ ips ] + row 
    end' infile.csv >outfile.csv 
0

eine Flagge in der Substitution Mit „s“ Befehl (wie die gemeinsamen g , p oder d flag) können wir nur ein N-tes Vorkommen ersetzen. So zum Beispiel:

<file sed 's/"//10' 

das 10. doppelte Anführungszeichen '"' entfernen

<file sed -e 's/"//11' -e 's/"//10' 

den 11. Zitat entfernen und dann die 10. Zitat auf jeder Zeile

sed 's|\([0-9]\)","\([0-9]\)|\1,\2|g' 

.. Dies speichert jede einzelne Ziffer [0-9], die um eine "," besteht, in zwei Gruppen.Wir können dann das Muster durch die erste Gruppe \1 ersetzen, gefolgt von einer Co MMA ,, gefolgt von der zweiten Gruppe \2. Wir fügen das "g" -Flag hinzu, das bewirkt, dass der Ersatzbefehl bei jedem Auftreten in der Zeile funktioniert.

0

Lassen Sie uns sagen, dass wir eine Datei test_sed mit den folgenden Zeilen haben:

"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4","1.2.3.5","some comment","" 
"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4","1.2.3.5","10.10.10.10","192.168.1.12","some comment","" 

Verwenden Sie zwei sed Befehle obwohl Pipeline Sequenz (Ausgabeumleitung):

cat test_sed | sed -re 's#"(([0-9]{1,3}\.){3}[0-9]{1,3})","(([0-9]{1,3}\.){3}[0-9]{1,3})"#"\1,\3"#gp;' 
    | sed -rn 's#,(([0-9]{1,3}\.){3}[0-9]{1,3})","(([0-9]{1,3}\.){3}[0-9]{1,3}),#,\1,\3,#gp;' 

Der Ausgang:

"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4,1.2.3.5,10.10.10.10,192.168.1.12","some comment","" 
"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4,1.2.3.5,10.10.10.10,192.168.1.12","some comment","" 

([0-9]{1,3}\.){3}[0-9]{1,3}) steht für IP-Adresse

Verwandte Themen