例如:
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_#");