たとえば、
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(不可能なバイト値)に設定するため、実際に開きます。喫煙perl
フル入力に作用するモードです。-pe 'code'
:sed
モデル。 (金利コード評価金利一度に1つのレコードを表現する血後で印刷してください。)s{...}{...}gse
:変えるGグローバルに文字列を次のように処理します。S1行(.
改行文字も一致)置換項目はPerlとして扱われます。金利表現する金利評価する。\K
:3月K■交換するセクションの先頭です。(?2)
: 再帰的な正規表現を実行する方法です。 2番目のグループ(...)
に含まれる正規表現がここに含まれます。だから\((:(?2)|.)*?\)
。は、(
一連の追加(...)
グループまたはその他の文字(できるだけ少ない数)の後にあります)
。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_#");