INSERT INTO `db`.`table`
VALUES (
39741633
49302045
0
44
'{"CustomerName":"S","CustomerMobile":"8","CustomerEmail":"","VersionId":"5","CityId":"2","CampaignId":"1","InquirySourceId":"3","Eagerness":"-1","ApplicationId":"2","BranchId":"3","AssignedDealerId":"2","DMSInqNo":"45"}'
NULL
0
'2021-11-09 19:11:50'
NULL
1
29
NULL
);
INSERT INTO `db`.`table`
VALUES (
39741635
49970365
0
30
'{"CustomerName":"A","CustomerEmail":"[email protected]","CustomerMobile":"9","VersionId":"6","InquirySourceId":"1","Eagerness":"-1","IsCorporate":"z","CampaignId":"8","BranchId":"3","ApplicationId":"1","Location":{"City":{"CityId":"1"},"Area":{"AreaId":"4"}},"CouponCode":null,"CwOfferId":"0","AssignedDealerId":"0","PinCode":""}'
NULL
0
'2021-11-09 19:11:51'
NULL
1
29
NULL
);
binlogからこれらの挿入文を抽出しました。まったくそう見えません。いくつか変更しましたが、まだ輻輳状態です。これを実際の挿入ステートメントに変換する必要があります。すべての挿入ステートメントについて、2行目(INSERT INTO db
. VALUES())の後のすべての行の末尾にカンマを追加する必要があります。table
これは、11行目までの2行の後にカンマを追加してから、INSERT INTOの後に再起動して繰り返すことを意味します。
Googleでこれを見つけました。
sed '/INSERT/{n;n;n;n;n;s/$/,/}' teststring.txt
-->挿入後、5行目にカンマが追加されます。問題は、6行目をもう一度実行すると
sed '/INSERT/{n;n;n;n;n;n;s/$/,/}' teststring.txt
、最初のSEDコマンドによって配置された古いコンマを置き換えます。
ファイルの外観は次のとおりです。
INSERT INTO `db`.`table`
VALUES (
39741633,
49302045,
0,
44,
'{"CustomerName":"S","CustomerMobile":"8","CustomerEmail":"","VersionId":"5","CityId":"2","CampaignId":"1","InquirySourceId":"3","Eagerness":"-1","ApplicationId":"2","BranchId":"3","AssignedDealerId":"2","DMSInqNo":"45"}',
NULL,
0,
'2021-11-09 19:11:50',
NULL,
1,
29,
NULL
);
INSERT INTO `db`.`table`
VALUES (
39741635,
49970365,
0,
30,
'{"CustomerName":"A","CustomerEmail":"[email protected]","CustomerMobile":"9","VersionId":"6","InquirySourceId":"1","Eagerness":"-1","IsCorporate":"z","CampaignId":"8","BranchId":"3","ApplicationId":"1","Location":{"City":{"CityId":"1"},"Area":{"AreaId":"4"}},"CouponCode":null,"CwOfferId":"0","AssignedDealerId":"0","PinCode":""}',
NULL,
0,
'2021-11-09 19:11:51',
NULL,
1,
29,
NULL
);
この目標をどのように達成できますか?
ベストアンサー1
カンマを追加して、特定の文字列を含まないすべての行を一致させることができます。
sed '/.*VALUES.*\|.*INSERT.*\|);$/! s/$/,/' your_file
仕組みは次のとおりです。
- を含む
VALUES
またはINSERT
終了するすべての行に一致します);
。 - これは、異なる文字列を一緒に連結することによって行われます
\|
。 - その後、使用します
!
(したがって、これらの文字列を含まない行だけが実際に一致します)。 - 次に、この行の後にコンマを追加します。
必要に応じて機能していることを確認したら、代わりに-i
交換を追加してください。
sed -i '/.*VALUES.*\|.*INSERT.*\|);$/! s/$/,/' your_file
編集する
@theyが以下のコメントで指摘したように、このコマンドは各INSERTステートメントの最後の行にもカンマを配置します(これが問題かどうかはわかりません)。
INSERT INTO `db`.`table`
VALUES (
39741633,
.
.
.
29,
NULL, <--- unecessary comma here
);