SQL文に変換する必要があるテキストデータを含むファイルがあります。
@Parse ABC
// This is a comment
//-----
"f2"
f4-1
$f5f5f5f5 0000
f4-2
$f5f5f5f5 0001
$f5f5f5f5 0002
f4-3
$f5f5f5f5 0003
$f5f5f5f5 0004
f4-4
$f5f5f5f5 0005
$f5f5f5f5 0006
f4-5
$f5f5f5f5 0007
$f5f5f5f5 0008
$f5f5f5f5 0009
$f5f5f5f5 0010
$f5f5f5f5 0011
$f5f5f5f5 0012
//========
"This is f2 but is different from the previous f2"
f4-6
$f5f5f5f5 0013
f4-7
$f5f5f5f5 0014
$f5f5f5f5 0015
f4-8
$f5f5f5f5 0016
$f5f5f5f5 0017
f4-9
$f5f5f5f5 0018
$f5f5f5f5 0019
f4-10
$f5f5f5f5 0020
$f5f5f5f5 0021
$f5f5f5f5 0022
$f5f5f5f5 0023
$f5f5f5f5 0024
$f5f5f5f5 0025
//========
最初はファイルが上記のようになります。
ファイルが次のようになりたい
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "f2-1", "", "f4-1", "$f5f5f5f5 0000");
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "f2-1", "", "f4-2", "$f5f5f5f5 0001<TAB>$f5f5f5f5 0002");
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "f2-1", "", "f4-3", "$f5f5f5f5 0003<TAB>$f5f5f5f5 0004");
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "f2-1", "", "f4-4", "$f5f5f5f5 0005<TAB>$f5f5f5f5 0006");
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "f2-1", "", "f4-5", "$f5f5f5f5 0007<TAB>$f5f5f5f5 0008<TAB>$f5f5f5f5 0009<TAB>$f5f5f5f5 0010<TAB>$f5f5f5f5 0011<TAB>$f5f5f5f5 0012");
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "This is f2-2 but is different from the previous f2-1", "", "f4-6", "$f5f5f5f5 0013");
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "This is f2-2 but is different from the previous f2-1", "", "f4-7", "$f5f5f5f5 0014<TAB>$f5f5f5f5 0015");
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "This is f2-2 but is different from the previous f2-1", "", "f4-8", "$f5f5f5f5 0016<TAB>$f5f5f5f5 0017");
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "This is f2-2 but is different from the previous f2-1", "", "f4-9", "$f5f5f5f5 0018<TAB>$f5f5f5f5 0019");
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "This is f2-2 but is different from the previous f2-1", "", "f4-10", "$f5f5f5f5 0020<TAB>$f5f5f5f5 0021<TAB>$f5f5f5f5 0022<TAB>$f5f5f5f5 0023<TAB>$f5f5f5f5 0024<TAB>$f5f5f5f5 0025");
以下のコマンドを使用して、元のファイルを現在の出力に変更しました。以下のコマンドで使用されているすべてのファイルには dos 行末があります。
sed -e 's/[[:space:]]$//' -e 's/^[[:alnum:]*()].*/INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "&", "");/' /path/to/files/* > '/path/to/file.sql';
"file.sql"の現在のデータは次のとおりです。
@Parse ABC
// This is a comment
//-----
"f2"
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-1", "");
$f5f5f5f5 0000
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-2", "");
$f5f5f5f5 0001
$f5f5f5f5 0002
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-3", "");
$f5f5f5f5 0003
$f5f5f5f5 0004
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-4", "");
$f5f5f5f5 0005
$f5f5f5f5 0006
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-5", "");
$f5f5f5f5 0007
$f5f5f5f5 0008
$f5f5f5f5 0009
$f5f5f5f5 0010
$f5f5f5f5 0011
$f5f5f5f5 0012
//========
"This is f2 but is different from the previous f2"
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-6", "");
$f5f5f5f5 0013
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-7", "");
$f5f5f5f5 0014
$f5f5f5f5 0015
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-8", "");
$f5f5f5f5 0016
$f5f5f5f5 0017
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-9", "");
$f5f5f5f5 0018
$f5f5f5f5 0019
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-10", "");
$f5f5f5f5 0020
$f5f5f5f5 0021
$f5f5f5f5 0022
$f5f5f5f5 0023
$f5f5f5f5 0024
$f5f5f5f5 0025
//========
上記のデータを次のように変更したいと思います。
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-1", "");
INSERT INTO `` (`f1`, `f2`, `f3`, `f4`, `f5`) VALUES (NULL, "", "", "f4-2", "$f5f5f5f5 0000");
データを含むファイルには dos 行末があります。
sed -r "s/\", \"\"\);\r\n(.*)\r\nINSERT INTO/\", \"\1\");\r\nINSERT INTO/" /path/to/file.sql;
上記のコマンドはエラーなしで実行されますが、コマンドの出力は入力と同じです。
最初は正しく機能しようとしましたが、これはほとんど固定文字の問題をsed -e
回避する修正不可能なエラーを引き起こしました。sed -r
ただ\r\n
、しかし----
交換されていないので、ここに問題があると思います。
だから私はsed
オンライン作業を見つけましたが、それを実現できませんでした。したがって、必ずしもsedで行う必要はありません。代わりに何を使うかはわかりませんが、誰かが提案したい場合は喜んでいます。問題が発生した場合は、自分で試してください。問題が見つかったら、再公開できます。
ベストアンサー1
ノートこの回答が公開されてから、サンプル入力/必須出力が大幅に変更されたため、現在の問題は解決されない可能性があります。
次の解決策は次のことを前提としています。
- 挿入する値は、行の唯一の文字列トークンです。
- 値が挿入される場所は
"");
スキーマです。
この場合、次のawk
手順が機能するはずです。
awk 'index($0,"INSERT")==1 && buf {sub(/"");/, "\"" buf "\");"); buf=""}
NF==1{buf=$1;next} 1' input.txt
仕組みは次のとおりです。
- 行がで始まり、バッファ変数が埋められると、パターンは、、
INSERT
最後に置き換えられます。その後、変数が消去されます。buf
"");
"
buf
");
buf
- 行にフィールドが1つしかない場合、この行は次の行に埋め込まれる値を含む行と見なされ、変数に入力されます
buf
(そうでない場合、処理はすぐに次の行に移動します)。 1
ルールブロックの外側にあるように見えることは、すべての修正を含む現在の行を印刷するように指示{ ... }
します。awk
行の前に複数の「値」行がある場合は、INSERT
最後の「値」行の内容を使用してください。空行は無視されます(ただし、出力には表示され続けます)。で始まらない複数の「単語」を含む行INSERT
もそのまま印刷されます。
awk
ファイルの内部編集はデフォルトでは行われないため、(のように)sed
出力をファイルにリダイレクトし、後で元の入力を上書きする必要があります。または(かなり新しいGNU Awkがある場合)-i inplace
拡張を使用してください。内部編集を行います。
dos2unix
DOS行の終わりをUnixスタイルに置き換えるには、処理する前に元のファイルを実行することをお勧めします。unix2dos
変更されたファイルにDOS行の終わりが必要な場合は、後で実行できます。