2016-04-15 6 views
0

Ich habe die folgende Datei ausgegeben, die manipuliert werden muss (bereinigt)sed mehrere Muster und löschen Rest

"2016-02-29;tracking;teamA;Name;45,0;7,0;315,0;659;"this is some free text";"911 Some Category";"again #pattern2 some free text #pattern1 #pattern3" 

Ich muss filtern und mehrere Muster zu halten und den Rest eines Teils der Zeile zu löschen. Die Zeile sollte wie folgt aussehen:

"2016-02-29;tracking;teamA;Name;45,0;7,0;315,0;659;"this is some free text";"911 Some Category";"#pattern2 #pattern1 #pattern3" 

Also muss ich nur einen Teil der Zeile manipulieren und den Rest behalten.

fand ich Möglichkeiten für mehrere Muster wie

sed -e "s/#pattern1/#pattern1/g" -e "s/#pattern2/#pattern2/g" 

und ich fand Wege zu suchen, alles, aber das Muster zu löschen:

sed -e "s/.*#pattern1.*/#pattern1/g" 

EDIT: meine Lösung im Moment:

Ich nehme den Teil der Zeile mit awk (delimiter;), egrep -o und füge ihn an das Original an. Sieht wie folgt aus:

#!/bin/bash 
FILE=$1 
REGEXP="#(pattern1|pattern2|)" 
paste $FILE <(cat $FILE |awk -F';' '{print$11}' | while read a; do a=$(echo $a | egrep -io "${REGEXP}" | sort -u) ; echo ";"${a//$'\n'/ } ; done) 
+1

Während es nicht schwierig ist, ein sed-Skript zu schreiben, um dies zu tun, wäre es wahrscheinlich ein Chaos und es gibt viel bessere Alternativen. – 123

+0

Bearbeiten Sie Ihre Frage, um eine [mcve] einzuschließen. Wie es aussieht, ist es ziemlich vage. –

+0

Ich denke, ich habe mich geärgert. Das Problem ist, dass ich nicht die ganze Linie eingefügt habe und dies zu Missverständnissen geführt hat. Ich füge es in die Frage ein. – JackOverflow

Antwort

1

Während sed sicherlich die Arbeit machen kann, ich grep (oder egrep hier) verwenden würde:

egrep -o "pattern1|pattern2|pattern3" inputfile | tr '\n' ' ' 
+0

danke für die Antwort. Das Dokument hat viele Zeilen und nur einen Teil der ganzen Zeile, die ich bearbeiten muss. Für was Sie hier sehen, ist es nur die awk -F ';' '{print $ 14}' einer Zeile. – JackOverflow

+0

Dies funktioniert, aber die Ausgabe ist in mehreren Zeilen überspannt – sjsam

+0

@JackOverflow verstehe ich nicht. Warum würde es nicht für mehrere Zeilen funktionieren? – pfnuesel

0

Sie können Matches negieren mit !, und Sie können auch unterdrücken auto- Drucken mit der Option -n. In diesem Fall müssen Sie die Zeilen, die Sie behalten möchten, explizit mit dem Befehl n drucken.

Verwandte Themen