我正在嘗試將一個巨大的 mySQL 資料庫轉儲檔案從 mySQL 語法轉換為 SQLite 語法。
在https://regex101.com/我已經成功地創建了一個 ECMAScript 風格的正則運算式來變成這樣的:
,'foo\'s bar!',
進入:
,"foo\'s bar!"
使用這個正則運算式:
/,'([^'] )\\'([^'] )',/"$1\\'$2"/g
針對這個短檔案進行測驗:
(1058,'gpl5q0x51349lmdq3e0ijm4k9b6n','Henry\'s_1.csv','text/csv','{\"identified\":true,\"analyzed\":true}',33854,'mUVk0/XGX afIpkrqBm7LQ==','2021-01-06 03:07:23'),
(1059,'xzj8mivsenkakkrurfjytxjsaj1h','Henry\'s_2.csv','text/csv','{\"identified\":true,\"analyzed\":true}',33555,'KfRYqfAWtSIYXZ6oQZyYbA==','2021-01-06 03:07:23'),
導致:
(1058,'gpl5q0x51349lmdq3e0ijm4k9b6n'"Henry\'s_1.csv"'text/csv','{\"identified\":true,\"analyzed\":true}',33854,'mUVk0/XGX afIpkrqBm7LQ==','2021-01-06 03:07:23'),
(1059,'xzj8mivsenkakkrurfjytxjsaj1h'"Henry\'s_2.csv"'text/csv','{\"identified\":true,\"analyzed\":true}',33555,'KfRYqfAWtSIYXZ6oQZyYbA==','2021-01-06 03:07:23'),
但是對于我的生活,我無法將其轉換為 GNU sed 風味的正則運算式。例如,此命令不會在輸出中進行任何替換:
sed -r s/,'([^'] )\\'([^'] )',/"$1\\'$2"/g <test.sql
...
sed -r s/,'([^'] )\\'([^'] )',/"\1\\'\2"/g <test.sql: doesn't work either.
我在網上尋找了一種可以在不同風格的正則運算式之間進行轉換的正則運算式工具,但找不到適用于 GNU sed 的工具(GIT 隨附:sed (GNU sed) 4.8)。PCRE 似乎接近于 sed 所擁有的,但這不起作用。我也試過 perl,沒有運氣。任何人都知道有效的正則運算式或有效的翻譯工具?我正準備撰寫一個 nodejs 程式來為我做這件事。
另外,為了額外的功勞,我如何撰寫 sed 腳本來處理帶引號的字串中任意數量的轉義引號?我的資料庫轉儲檔案中也有這個問題需要處理。
例子:
'foo\'-bar' // on instance
'foo\'and\'bar' // two instances
'foo\'and\'bar\'s on the deck' // three instances
and so on...
謝謝!
uj5u.com熱心網友回復:
您可以使用
sed -E "s/,'([^'] )\\\\'([^'] )',/"'"'"\\1\\\\'\\2"'"'/g test.sql
在"s/,'([^'] )\\\\'([^'] )',/"'"'"\\1\\\\'\\2"'"'/g由
"s/,'([^'] )\\\\'([^'] )',/"-s/,'([^'] )\\'([^'] )',/一部分(在雙引號內,所以反斜杠需要加倍)'"'- 一個"字符(在單引號內)"\\1\\\\'\\2"-\1\\'\2模式(在雙引號內,所以反斜杠加倍)'"'- 一個"字符(在單引號內)/g- 全域標志(此處無需參考)。
uj5u.com熱心網友回復:
先看看你的命令
sed -r s/,'([^'] )\\'([^'] )',/"\1\\'\2"/g test.sql
我更喜歡sed用單引號寫整個命令。當你需要一個單引號,你必須關閉字串('),使用一個轉義單引號(\')并打開下一個字串與'所有加盟:'\''。
我還添加了兩個,字符。
sed -r 's/,'\''([^'\''] )\\'\''([^'\''] )'\'',/,"\1\\'\''\2",/g' test.sql
# Shorter
sed -r 's/,'\''([^'\''] \\'\''[^'\''] )'\'',/,"\1",/g' test.sql
# Using another way to write the single quotes, with the hex notation
sed -r 's/,\x27([^\x27] \\\x27[^\x27] )\x27,/,"\1",/g' test.sql
這適用于簡單的情況,不適用于'foo\'and\'bar\'s on the deck'.
我認為您也想替換簡單欄位中的引號。
假設你想轉型
(1058,'gpl5q0x51349lmdq3e0ijm4k9b6n','Henry\'s_1.csv','text/csv','{\"identified\":true,\"analyzed\":true}',33854,'mUVk0/XGX afIpkrqBm7LQ==','2021-01-06 03:07:23'),
(1059,'xzj8mivsenkakkrurfjytxjsaj1h','Henry\'s_2.csv','text/csv','{\"identified\":true,\"analyzed\":true}',33555,'KfRYqfAWtSIYXZ6oQZyYbA==','2021-01-06 03:07:23'),
(2000,'extra credit from question','foo\'and\'bar\'s on the deck','text/csv','{\"identified\":true,\"analyzed\":true}',33999,'KgSBFstbdthdsssssstvbA==','2022-01-02 13:07:23'),
進入
(1058,"gpl5q0x51349lmdq3e0ijm4k9b6n","Henry\'s_1.csv","text/csv","{\"identified\":true,\"analyzed\":true}",33854,"mUVk0/XGX afIpkrqBm7LQ==","2021-01-06 03:07:23"),
(1059,"xzj8mivsenkakkrurfjytxjsaj1h","Henry\'s_2.csv","text/csv","{\"identified\":true,\"analyzed\":true}",33555,"KfRYqfAWtSIYXZ6oQZyYbA==","2021-01-06 03:07:23"),
(2000,"extra credit from question","foo\'and\'bar\'s on the deck","text/csv","{\"identified\":true,\"analyzed\":true}",33999,"KgSBFstbdthdsssssstvbA==","2022-01-02 13:07:23"),
在這個答案中,我不使用'\''但十六進制表示法\x27。
首先“備份”\'組合(將它們替換為未使用的字符,如\r),用雙引號替換所有正常引號并“恢復備份”(改回\r)。
sed 's/\\\x27/\r/g; s/\x27/"/g; s/\r/\\\x27/g' test.sql
# or hex value for double quote "
sed 's/\\\x27/\r/g; s/\x27/\x22/g; s/\r/\\\x27/g' test.sql
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/401307.html
下一篇:從正則運算式組中排除一些字符
