2013-03-19 14 views
9

Ich habe fast alles versucht (ich denke), aber nichts hat funktioniert. (Betriebssystem: Ubuntu 12,04)Regex Space Charakter in Sed

Ausdrücke abgestimmt werden (aus Textdateien entfernt):

a c 4 
a k 23 
o s 1 

Was ich versucht:

's/[[a-z][:space:][a-z][:space:][0-9]]\{1,\}//gi' 
's/.\s.\s[0-9]+//g' 
's/[:alpha:][:space:][:alpha:][:space:][:digit:]+' 

Antwort

13

Dies sollte passen:

sed 's/[a-z][ ]*[a-z][ ]*[0-9]*//gi' 

Ihr erster Versuch verfehlt ein paar eckige Klammern, und Sie brauchen nicht das äußerste o ne:

sed 's/[a-z][[:space:]][a-z][[:space:]][0-9]\{1,\}//gi' input 

Ihr zweites Beispiel schlägt fehl, weil Sie die +, entkommen müssen und immer noch wird es nur in Gnu arbeiten sed:

sed 's/.\s.\s[0-9]\+//g' input 

Auch einige ähnliche Probleme mit dem zuletzt:

sed 's/[[:alpha:]][[:space:]][[:alpha:]][[:space:]][[:digit:]]\+//' input 
1

Die in der Mitte ist schließen! Du musst dem Pluszeichen aus einem Grund entgehen, der jenseits meiner ist. Ich ersetzte auch den Punkt "." durch "[a-z]", so dass es nur Buchstaben entspricht.

sed 's/[a-z]\s[a-z]\s[0-9]\+//g' 

Bonus portable Version für ältere sed -Versionen (Hallo, Mac-Nutzer!). Einige sed Implementierungen sind pingelig auf der "+":

sed 's/[a-z]\s[a-z]\s[0-9][0-9]*//g' 
1

[...] definiert eine Zeichenklasse. [a-z] entspricht einem beliebigen Zeichen von a bis z. Um aufeinander folgende Zeichen zu vergleichen, müssen Sie für jede eine Klasse verwenden: [a-z][[:space:]][a-z].

Für + die besondere Bedeutung haben, müssen Sie Backslash es: [0-9]\+.

Benannte Zeichenklassen funktionieren nur innerhalb von Zeichenklassen, d. H. [[:alpha:]][[:space:]].

Verwandte Themen