zum Beispiel:
CREATE TABLE MWWDATA."VTCat02" (
"ID" NUMBER(10) DEFAULT NULL ,
"Cat" VARCHAR2(255) DEFAULT NULL ,
"Style_Code" VARCHAR2(255) DEFAULT NULL ,
"Vendor_Style_#" VARCHAR2(255) DEFAULT NULL );
Im obigen Beispiel möchte ich die Zeile drucken, die mit CREATE TABLE beginnt, und in der restlichen Zeile nur das erste Feld drucken.
Ich möchte eine Ausgabe wie
CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_code","Vendor_Style_#");
Antwort1
Mit awk
:
awk '/^CREATE TABLE/{
inside = 1
sep = ""
printf "%s", $0
next
}
inside {
printf "%s", sep $1
sep = ","
if (/\);$/) {
print ");"
inside = 0
}
}'
Dabei wird davon ausgegangen, dass die Anweisungen CREATE TABLE
am Zeilenanfang mit beginnen und );
am Zeilenende (aber nicht in derselben Zeile) mit enden und dass jeder Spaltenname das erste Feld der nachfolgenden Zeilen ist (was bedeutet, dass Spaltennamen keine Leerzeichen enthalten dürfen).
Antwort2
Klingt eher nach einem Job für perl
:
perl -0777 -pe 's{(CREATE TABLE \S+\s+)\K(\((?:(?2)|.)*?\))}
{"(" . join(",", $2 =~ /".*?"/g) . ")"}gse'
(Dies setzt voraus, dass die zitierten Zeichenfolgen keine nicht übereinstimmenden Klammern enthalten und dass eine einigermaßen aktuelle Version von vorliegt perl
.)
Heruntergebrochen:
-0777
, setzen Sie den Datensatztrenner auf 0777 (ein unmöglicher Byte-Wert), wodurch in der Tat dieschlürfenModus, derperl
auf die gesamte Eingabe als Ganzes einwirkt.-pe 'code'
:sed
Modus. (twertet den Code austxpression einen Datensatz nach dem anderen undPdruckt es anschließend aus).s{...}{...}gse
: ErsatzGlobally, behandelt Zeichenfolge alsSingle line (.
entspricht auch Zeilenumbruchzeichen), und die Ersetzung ist als Perl zu behandelntAusdruck zutbewerten.\K
: Märzks der Beginn des zu ersetzenden Teils.(?2)
: eine Möglichkeit, rekursive reguläre Ausdrücke zu erstellen. Hier ist der in der zweiten(...)
Gruppe eingeschlossene reguläre Ausdruck enthalten. Also\((:(?2)|.)*?\)
. Ist ein(
gefolgt von einer Folge weiterer(...)
Gruppen oder anderer Zeichen (so wenig wie möglich), gefolgt von)
.join(",", $2 =~ /".*?"/g)
verbindet die Liste der übereinstimmenden Zeichenfolgen".*?"
(also der in Anführungszeichen gesetzten Zeichenfolgen)$2
mit einem Komma.
Antwort3
Verwendung von awk
:
awk '{if (NR==1) {printf "%s", $0} else {printf "%s,",$1}} END {printf "^H);\n"}' /tmp/inputfile
Erste Übereinstimmung, wenn wir uns in der ersten Eingabezeile befinden. Wenn ja, drucken Sie die ganze Zeile, andernfalls drucken Sie das erste Wort, gefolgt von einem Komma.
Als letzten Schritt drucken Sie eine Rücktaste, um das letzte Komma zu entfernen und die schließende Klammer und eine neue Zeile zu drucken. Das Rücktaste-Zeichen wird mithilfe von in die Befehlszeile eingefügt ctrl+vctrl+h. Die ctrl+hTaste entspricht dem 8. Buchstaben des Alphabets (H) und der Tastencode 8 entspricht einer Rücktaste.
Die Ausgabe lautet:
CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_Code","Vendor_Style_#");