[Gelöst] Auf Bash Regex mit capture group

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
buhtz
Beiträge: 1106
Registriert: 04.12.2015 17:54:49
Kontaktdaten:

[Gelöst] Auf Bash Regex mit capture group

Beitrag von buhtz » 16.02.2024 15:41:42

Mein Regex pattern ist IMHO eigentlich korrekt und läuft auch problemlos auf regex101.

Nun möchte ich das aber auf der bash auf einen Output (mit über 7000 Zeilen) anwenden:

Code: Alles auswählen

ruff check --select ALL . | grep '\: (\w+\d+) '
Gibt nur diese beiden Zeilen, die sich vermutlich auf ein regex Problem beziehen?

Code: Alles auswählen

warning: `one-blank-line-before-class` (D203) and `no-blank-line-before-class` (D211) are incompatible. Ignoring `one-blank-line-before-class`.
warning: `multi-line-summary-first-line` (D212) and `multi-line-summary-second-line` (D213) are incompatible. Ignoring `multi-line-summary-second-line`.
So sieht der zu parsende Output aus. Ich möchte dort die Fehlercodes extrahieren:

Code: Alles auswählen

tests/test_zuf.py:179:35: Q000 [*] Single quotes found but double quotes preferred
tests/test_zuf.py:181:9: ANN201 Missing return type annotation for public function `test_valid_scores`
tests/test_zuf.py:181:27: ANN101 Missing type annotation for `self` in method
tests/test_zuf.py:182:9: D209 [*] Multi-line docstring closing quotes should be on a separate line
tests/test_zuf.py:205:37: Q000 [*] Single quotes found but double quotes preferred
tests/test_zuf.py:207:9: ANN201 Missing return type annotation for public function `test_valid_scores_with_missings`
Zuletzt geändert von buhtz am 16.02.2024 16:09:22, insgesamt 1-mal geändert.
Debian 11 & 12; Desktop-PC, Headless-NAS, Raspberry Pi 4
Teil des Upstream Betreuer Teams von Back In Time (Debianbackintime)

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Auf Bash Regex mit capture group

Beitrag von JTH » 16.02.2024 16:02:50

Das hat mit der Bash selbst eigentlich nichts zu tun.

Ist das Muster in den Zeilen immer gleich und steht in jeder Zeile ein gesuchter Code, umrahmt mit Leerzeichen? Dann ginge das mit awk noch einfacher:

Code: Alles auswählen

ruff check --select ALL . | awk '{ print $2 }'

Wenn ich mich so aus dem Kopf nicht vertue, kennt grep Capture Groups, so wie du sie hier verwenden möchtest, gar nicht (korrigiert mich gerne).
Manchmal bekannt als Just (another) Terminal Hacker.

buhtz
Beiträge: 1106
Registriert: 04.12.2015 17:54:49
Kontaktdaten:

Re: Auf Bash Regex mit capture group

Beitrag von buhtz » 16.02.2024 16:09:10

Sehr nice. Danke so geht es.

Kleines AddOn: Duplikate aus der Liste entfernt.

Code: Alles auswählen

ruff check --select ALL . | awk '{ print $2 }' | sort | uniq
Debian 11 & 12; Desktop-PC, Headless-NAS, Raspberry Pi 4
Teil des Upstream Betreuer Teams von Back In Time (Debianbackintime)

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [Gelöst] Auf Bash Regex mit capture group

Beitrag von JTH » 16.02.2024 16:58:55

Code: Alles auswählen

sort | uniq
geht noch wieder zusammengefasst in einem Schritt als

Code: Alles auswählen

sort -u
Manchmal bekannt als Just (another) Terminal Hacker.

tobo
Beiträge: 1997
Registriert: 10.12.2008 10:51:41

Re: [Gelöst] Auf Bash Regex mit capture group

Beitrag von tobo » 16.02.2024 17:17:11

Auf die grep-Fragestellung bezogen benötigst du PCRE (\d) dafür. Da \d ([0-9]) aber in \w ([a-zA-Z0-9_]) enthalten ist, stimmen die Grundvoraussetzungen überhaupt nicht:

Code: Alles auswählen

grep -oP ': \K[A-Z]+\d+(?= )'
## oder einfacher/intuitiver mit:
pcregrep -o1 ': ([A-Z]+\d+) '
Da \K kein rechtsbündiges Äquivalent hat, sieht das grep ein bisschen ungelenk aus. Für capturing groups ist pcregrep deutlich besser geeignet...

EDIT: Es ist übrigens was anderes, die RegEx zu matchen oder das 1. Wort nach einem " " auszuschneiden (... | cut -d" " -f2)!

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: [Gelöst] Auf Bash Regex mit capture group

Beitrag von JTH » 16.02.2024 18:31:33

Noch als Ergänzung: Je nachdem, wie du die Infos weiterverarbeiten möchtest, buhtz, könnte sich auch ein anderes, ausdrücklich maschinenlesbares Ausgabeformat anbieten. ruff hat dafür anscheinend die Option --output-format.
Manchmal bekannt als Just (another) Terminal Hacker.

Antworten