例如:
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 );
在上面的範例中,我想列印以 CREATE TABLE 開頭的行,並在其餘行中僅列印第一個欄位。
我想要像這樣的輸出
CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_code","Vendor_Style_#");
答案1
和awk
:
awk '/^CREATE TABLE/{
inside = 1
sep = ""
printf "%s", $0
next
}
inside {
printf "%s", sep $1
sep = ","
if (/\);$/) {
print ");"
inside = 0
}
}'
該語句依賴從CREATE TABLE
行首開始,到);
行尾結束(儘管不是同一行)的語句,每個列名是後續行的第一個欄位(意味著列名不能包含空白)。
答案2
聽起來更像是一份工作perl
:
perl -0777 -pe 's{(CREATE TABLE \S+\s+)\K(\((?:(?2)|.)*?\))}
{"(" . join(",", $2 =~ /".*?"/g) . ")"}gse'
(假設引用的字串不包含不匹配的括號和合理的最新版本perl
)。
細分:
-0777
,將記錄分隔符號設為 0777(不可能的位元組值),因此實際上開啟了吸食模式 whereperl
作用於整個輸入。-pe 'code'
:sed
模式。 (e評估程式碼e一次表達一筆記錄p之後再列印)。s{...}{...}gse
: 代替G全域上,將字串視為s單行(.
也匹配換行符),並且替換將被視為 perle表達到e評估。\K
: 三月ks 要替換的部分的開始。(?2)
:執行遞歸正規表示式的一種方法。這裡包括第二(...)
組中包含的正規表示式。所以\((:(?2)|.)*?\)
。是 a(
後跟一系列更多(...)
組或其他字元(盡可能少),後跟)
。join(",", $2 =~ /".*?"/g)
用逗號連接匹配的字串列表".*?"
(即帶引號的字串) 。$2
答案3
使用awk
:
awk '{if (NR==1) {printf "%s", $0} else {printf "%s,",$1}} END {printf "^H);\n"}' /tmp/inputfile
如果我們在輸入的第一行,則首先匹配,如果是,則列印整行,否則列印第一個單詞,後面跟著逗號。
最後一步,列印一個退格鍵以刪除最後一個逗號並列印右大括號和換行符。退格字元使用 插入到命令列ctrl+vctrl+h。此ctrl+h鍵對應於字母表中的第 8 個字母 (H),鍵碼 8 對應於退格鍵。
輸出將是:
CREATE TABLE MWWDATA."VTCat02" ("ID","Cat","Style_Code","Vendor_Style_#");