Ich habe mir den folgenden regulären Ausdruck ausgedacht:
\[release(\s+(?<release_type>.*))?\]\n+(?<release_notes>.*)
Die Idee besteht darin, eine Commit-Nachricht nach mehreren Parametern zu analysieren:
[release minor]
Hello world
- asd
- zxc
Das Ergebnis der Übereinstimmung sollte release_type = 'minor'
, sein release_notes = 'Hello world\n…
.
Ich versuche, Perl zu verwenden, da macOS alte Regex-Engines hat.
Ich habe es versucht:
perl -e 'print "$+{release_notes}" while /\[release(\s+(?<release_type>.*))?\]\n+(?<release_notes>.*)/gs;' msg.txt
Aber aus irgendeinem Grund funktioniert dieser Ausdruck nicht wie erwartet.
Tatsächlich sogar die einfacheren
perl -ne 'print "$+{release_notes}" while /\n(?<release_notes>.*)/gs;' msg.txt
schlägt fehl.
Das
perl -ne 'print "$+{release_notes}" while /(?<release_notes>.*)/gs;' msg.txt
ist erfolgreich und gibt einfach die gesamte Eingabe zurück.
Wahrscheinlich übersehe ich hier etwas Einfaches, bin mir aber nicht sicher, was es ist.
Antwort1
Diese AntwortGeben Sie mir eine Lösung: Das Hinzufügen -0777
zum Befehl behebt das Problem.
Zitieren:
Das ist auch weiterhin notwendig, auch wenn die
-0777
hebt dieEingabedatensatz-Trennzeichen, sodass die Datei sofort gelesen wird; siehe https://stackoverflow.com/questions/37582501/why-use-the-pn-in-slurp-mode-in-perl-one-liner/37583183#37583183