パターンと一致しない行にテキストを追加する

パターンと一致しない行にテキストを追加する
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
);

おすすめ記事