ubuntuusers.de

Alle cpp-Dateien, die nicht mit "ui" anfangen?

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

suseuser

Avatar von suseuser

Anmeldungsdatum:
1. Juni 2009

Beiträge: 313

Wohnort: 127.0.0.1

Hallo

Ich bräuchte gerade mal ein Bash-Regex, das alle CPP- und H-Dateien, die nicht mit "ui" anfangen, erwischt.

Bisher arbeite ich mit

[at]{1}*.h [at]{1}*.cpp [vz]{1}*.h [vz]{1}*.cpp u[ah]{1}*.h u[jz]{1}*.h u[ah]{1}*.cpp u[jz]{1}*.cpp

, was aber erstens nicht funktioniert und mir zweitens akuten Augenkrebs verursacht...

Weiß jemand, wie es ekorrekt wäre? Meine bescheidenen Regex-Kenntnisse lassen mich nämlich gerade völlig im Stich.

Gruß,
Stephan

edith meint, es hieße Regex und nicht Reges. Meine Tastatur sah das anders.

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Funktioniert für ZSH, vielleicht auch für Bash:

ls [^ui]*

wenn es wirklich nur h und cpp Dateien sein müssen:

ls [^ui]*.{h,cpp}

suseuser

(Themenstarter)
Avatar von suseuser

Anmeldungsdatum:
1. Juni 2009

Beiträge: 313

Wohnort: 127.0.0.1

Danke, funktioniert.

deifl

Avatar von deifl

Anmeldungsdatum:
18. August 2006

Beiträge: 132

Wohnort: Esslingen

Kinch schrieb:

Funktioniert für ZSH, vielleicht auch für Bash:

ls [^ui]*

wenn es wirklich nur h und cpp Dateien sein müssen:

ls [^ui]*.{h,cpp}

Eine kleine Frage zu der Loesung:

Warum funktioniert sowohl

ls [^ui]*.{h,cpp}

als auch (so haette ich es versucht)

ls [^ui]*.(h|cpp)

in der zsh?

Einmal gescheifte Klammern {} gegenueber normalen Klammern () und einmal Komma , gegenueber dem Pipesymbol |.

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Ich denke die Zsh kombiniert einfach verschiedene gebräuchliche Syntax-Formen, um mit anderen Shell kompatibel zu sein. Es gibt aber auch einen Unterschied zwischen {} und (). Zumindest meiner Beobachtung nach: Die runden Klammern spielen eher eine Rolle beim Globbing um Regex-Style Globs zu schreiben. Die Geschweiften klammern Spielen eher eine Rolle bei der Substitution.

Mal ein Beispiel:

touch {first,second}.txt

Erzeugt die Dateien first.xt und second.txt, weil die geschweiften Klammern von der Shell entsprechend expandiert werden.

touch (first|second).txt

Erzeugt keine Dateien, weil die Shell das nur als Globbing versteht. Wenn die Dateien nicht vorhanden sind, wird auch nicht expandiert.

Ist zumindest bei meiner ZSH-Config so.

Edit:

Konkret zur Lösung:

ls [^ui]*.{h,cpp}

wird zur

ls [^ui]*.h [^ui]*.cpp

expandiert und dann erst wird der Globbing angewendet. Das ist natürlich nur suboptimal, falls es zum Beispiel keine *.h oder *.cpp gibt, die auf das Globbing passen, gibt es bei der Bash glaube ich einen Fehler. Die Schreibweise mit () ist da robuster, weil das nur ein Globbing-Ausdruck ist, aber ich weiß nicht, ob die Bash das unterstützt (benutze sie nie).

deifl

Avatar von deifl

Anmeldungsdatum:
18. August 2006

Beiträge: 132

Wohnort: Esslingen

Danke ☺

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

[^ui]*.{h,cpp} ist Quatsch, denn es schließt nicht nur die Dateien aus, die mit "ui" beginnen, sondern alle, die mit u oder i beginnen. Eine Möglichkeit, um das gewünschte zu erreichen, ist das Muster !(ui*).@(cpp|h). Für Details siehe bash-Handbuch.

suseuser

(Themenstarter)
Avatar von suseuser

Anmeldungsdatum:
1. Juni 2009

Beiträge: 313

Wohnort: 127.0.0.1

Hello World schrieb:

[^ui]*.{h,cpp} ist Quatsch, denn es schließt nicht nur die Dateien aus, die mit "ui" beginnen, sondern alle, die mit u oder i beginnen. Eine Möglichkeit, um das gewünschte zu erreichen, ist das Muster !(ui*).@(cpp|h). Für Details siehe bash-Handbuch.

$ ls !(ui*).@(cpp|h)
bash: !: event not found
ls !(ui)*.@(cpp|h)
bash: !: event not found

Hello_World

Anmeldungsdatum:
13. Juni 2006

Beiträge: 3620

Möglicherweise ist extended globbing bei Dir ausgeschaltet. Du kannst es mit dem Befehl shopt -s extglob einschalten. Und das steht alles auch im Handbuch.

suseuser

(Themenstarter)
Avatar von suseuser

Anmeldungsdatum:
1. Juni 2009

Beiträge: 313

Wohnort: 127.0.0.1

Hello World schrieb:

Möglicherweise ist extended globbing bei Dir ausgeschaltet. Du kannst es mit dem Befehl shopt -s extglob einschalten. Und das steht alles auch im Handbuch.

Okay, du hast recht. Nur ist das Handbuch nicht gerade das, was man allgemeinverständlich nennt 😉 (edit: Ich hatte sogar reingeschaut, war aber davon ausgegangen, dass die Optionen unter Ubuntu schon stimmen werden 😉 )

Danke jedenfalls für den Tip, es funktioniert jetzt.

Antworten |