PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : awk regex complemented list Funktioniert nicht



sevenko
08.11.12, 14:52
Hallo,
ich will mittels


awk '/[^#]/ printf("%s",$0)' datei

Alle Zeilen einer Datei ausfiltern die (am Anfang) ein # Zeichen enthalten.
Das obige Kommando listet aber alle Zeilen auf.
Wenn ich dem umgekehrten Fall betrachte:


awk '/[#]/ printf("%s",$0)' datei

dann bekomme ich wirklich nur die Zeilen mit # wieso geht das nicht umgekehrt?

medhefgo
08.11.12, 19:03
/[^#]/ gibt einen Treffer, wenn sich in der Zeile ein Zeichen befindet, dass kein # ist. Ob sich irgendwo im Rest der Zeile ein # befindet ist dafür dann uninteressant.

Wenn du ein regex in awk negieren willst kannst geht das so:

awk '! /#/ { print $0; }' file

Wenn du aber wirklich nur Zeilen haben willst, die kein # enthalten ist grep einfacher:

grep -v '#'

pibi
09.11.12, 07:31
Ich nehme an, es geht darum, auskommentierte Zeilen auszublenden;-)

Ich mache das immer so:
grep -E -v "(^#|^$)" filenameDamit werden auch leere Zeilen nicht angezeigt.

Gruss Pit.

sevenko
09.11.12, 09:46
Vielen dank euch beiden (es ging tatsächlich um das Ausblenden von Kommentaren, ich hatte gerade selbst eine Lösung gefunden und zwar diese hier:


awk '/^[^#]/ {print $0}' datei

Allerdings verstehe ich erste jetzt richtig wieso das funktioniert hat.
Ich habe mit Regulären Ausdrücken noch nicht so viel Erfahrung.

Aqualung
09.11.12, 11:01
Wahrscheinlich verstehst Du die unterschiedliche Bedeutung von "^" nicht richtig.

^ in "/^" bezeichnet den Anfang einer Zeile,

^ in [^a] negiert die folgenden Zeichen, also alle Zeilen, die "a" NICHT enthalten.