mit egrep zeilen suchen die etwas NICHT enthalten

N

Nano

Foren As
Hi folgendes problem, wiedermal... ;)

ich möchte mit egrep nach einer zeile suchen die etwas bestimmtes nicht enthält, dafür wäre der syntax egrep '[^wasichnichtwill]' datei


z.b Alle zeilen die ein o enthalten aber kein H
Code:
egrep 'o.*[^H]'

wo liegt der fehler ?
 
Code:
egrep 'o.*[^H]'
Zeigt alle Zeilen an, in denen ein o gefolgt von beliebigen Zeichen gefolgt von nicht H vorkommt.

Die ganze Zeile untersucht:
Code:
egrep '^[^H]*o[^H]*$'
Gruß Wolfgang
 
ah ja ich sehe wo das problem lag, danke;)
.
.
.
EDIT (autom. Beitragszusammenführung) :
.

gibt es eine möglichkeit auf diese weise mehrer zeichen in folge auszuschliessen ?

also quasi analog zu

Code:
alle zeilen die asdf nicht enthalten ausgeben :

egrep -v 'asdf' datei

analog in dieser form ( welche so nicht stimmt )

egrep '[^asdf]*' datei

zu schreiben
[\CODE]
 
Zuletzt bearbeitet:
erstmal: die code (eigentlich generell alle hier verwendeten) tags terminiert man mit einem slash, nicht backslash, also: [/code]

desweiteren: nimm dir nochmal zu herzen, was wolfgang gesagt hat, die regex
Code:
[^a]
ist keine schreibweise für: "a nicht matchen", sondern für "matche ein zeichen, welches kein a ist". klingt gleich, oder? aber beachte: bei der zweiten formulierung wird explizit klar, dass etwas gematcht werden soll, und nicht, dass etwas nicht gematcht werden soll, denn das können regexes (afaik) nicht. negated character classes sind ja auch eigentlich nur kurzschreibweisen.
Code:
[^7]
die character class matcht halt jedes zeichen bis auf eine 7, aber das explizit zu schreiben, wäre recht nervig, deswegen diese abkürzung...

nunja, es gibt noch lookahead und lookbehind, mit denen man das vielleicht gefrickelt kriegen könnte, aber generell würde ich sagen: das isses nicht wert.

man könnte auch sowas mit perl machen zb:
Code:
cat datei | perl -pe 's/.*(asdf)+.*//sg'
das würde alle zeilen, in denen "asdf" vorkommt löschen, allerdings um den "umweg" des matchens und dann durch "nichts" substituierens...

dein code btw:
Code:
egrep '[^asdf]* datei
mal angenommen, der *würde* so funktionieren: der würde dann auf jede zeile matchen, in der ein string vorkommen würde, der nicht auf "asdf" passt, also auch diese zeile zum beispiel:
das "blasd" könnte gematcht werden, ohne der "negierten" regex "in die quere zu kommen"(wobei das ziemlich theoretisch ist, da reguläre ausdrücke AFAIK so nicht funktionieren..). außerdem sollte man den asterisken (*) niemals isoliert in einer regex verwenden, weil das dann auch leere strings matcht, ...
aber wie gesagt: denke bei regulären ausdrücken lieber daran, was gematcht werden soll. so ziemlich jedes regex-tool das ich kenne, kann dann diese ergebnisse auch "herausfiltern". also quasi genau was du willst...

mal 'ne frage: was ist los mit "egrep -v", dass du's nicht benutzen willst? klingt wie für dich geschaffen...

@ausführungen über reguläre ausdrücke: ich lass mich sehr gerne eines besseren belehren, vielleicht kann man ja doch "nicht matchen"? o:
 
erstmal danke für die antwort.

mit egrep -v ist nichts los damit funktioniert es ja, tortzdem kann es ja gut sein das es mehrere möglichkeiten gibt und es interessierte mich einfach ob es eine möglichkeit gibt mit dem regex selbst die -v version zu ersetzen ;)
 

Ähnliche Themen

sed - Bitte um Unterstützung

Zeilen aus Txt-Datei entfernen, wenn eine Spalte einen bestimmten Wert enthält

Zeilen aus Textdatei löschen die $Var1 enthalten und nicht $Var2

Zeilen behalten, die Werte in einem bestimmten Bereich enthalten

Samba 3.6.25 - OpenLDAP Setup

Zurück
Oben