Könnten Sie mir helfen, korrekte Regex in bash zu erstellen?Endabgleich nach dem ersten Auftreten eines Wortes - Bash Regex
Was ich tun muss, ist jede Tabelle Definition von Struktur zu extrahieren wie:
OID: 123
Name: tab1
CREATE TABLE tab1 (
...
);
OID: 456
Name: tab2
CREATE TABLE tab2 (
...
);
OID: 789
Name: tab3
CREATE TABLE tab3 (
...
);
vorbereitet eine Zeile Format:
OID: 123 Name: tab1 CREATE TABLE tab1 (...); OID: 456 Name: tab2 CREATE TABLE tab2 (...); OID: 789 Name: tab3 CREATE TABLE tab3 (...);
Ich habe den gesamten Text zwischen den Wörtern Name
und OID
zu bekommen. Ich schrieb eine einfache Schleife, die spezifische Regex für jeden Tabellennamen vorbereitete, aber ich habe ein Problem mit der Übereinstimmung.
Für jede Tabelle meine regex Name ist so etwas wie:
(Name: tab2 .*?)(OID: .*)
Mein Ergebnis ist:
Name: tab2 CREATE TABLE tab2 (...)
ich oben regex in Online regex Simulator getestet und es funktioniert. Ich extrahiere nur die erste Gruppe aus der vollständigen Übereinstimmung. Batch Regex gruppiert es nicht ordnungsgemäß. Ich denke Batch weiß es nicht? (Null oder ein Vorkommen des vorhergehenden Elements). Ich habe kein Ergebnis mit der obigen Regex in bash.
Mein bash Befehl ist so etwas wie:
#!/bin/bash
tables_definition=$(less tables_definition.txt)
regex="(Name: tab2 .*?)(OID: .*)"
if [[ $tables_definition =~ $regex ]];
then
object_definition="${BASH_REMATCH[1]}"
#do something
fi
Bitte helfen.
können Sie den bash-Befehl posten, den Sie verwenden? –
hat gerade meinen Post bearbeitet – MrF
'. *?'ist ein Problem - POSIX ERE (der Standard, dem bashs Regexes entsprechen) hat keine nicht-gierigen Klumpen. (Die Regex-Engine ist nicht wirklich in bash integriert, sondern wird von der C-Bibliothek Ihres Betriebssystems bereitgestellt, sodass die Implementierung von Plattform zu Plattform ein wenig variieren kann. Die verwendeten Aufrufe sind jedoch zur Implementierung des ERE-Standards erforderlich eine plattformspezifische Erweiterung). –