我有一个 .sql 文件,每行包含约 15,000,000 个 INSERT 命令,如下所示:
INSERT INTO tableName (col1,col2,col3,col4,col5,col6,col7,col8) VALUES ('Jan 7 2018 12:33PM', 'R', 'essential-app', '15952008002', 'Jan 7 2018 12:30PM', '0', 'E', NULL);
我想包装两个日期/时间值,使它们看起来像STR_TO_DATE('Jan 7 2018 12:33PM',%b %d %Y %h:%i%p)
- 当然保留原始值。
我以前曾使用 sed 对文件进行过小的更改,但从未做过如此复杂的事情。如何同时定位这些日期/时间值,以及如何将字符串添加到匹配字符串的开头和结尾?
添加到开头:STR_TO_DATE(
添加到结尾:,%b %d %Y %h:%i%p)
能它可以在一个 sed 命令中完成,还是我需要为每个日期/时间值使用一个 sed 命令?
答案1
尝试:
sed -r -e 's/'\''[A-Z][a-z][a-z]\s+[0-9]+\s[0-9]{4}\s+[0-9]+:[0-9][0-9][AP]M'\''/STR_TO_DATE(&, '\''%b %d %Y %h:%i%p'\'')/g'
笔记:
'\''
是在单引号字符串中插入单引号的方法。正则表达式匹配:
- 单引号
'
,后跟 - 一个大写字母和两个小写字母
Jan
(或Feb
等等), - 一个或多个空格、一个或多个数字、一个空格、四位数字
7 2018
、 - 一个或多个空格、一个或多个数字、冒号、两位数字、 A 或 P、 M
12:30PM
,最后 - 另一个单引号
'
。
- 单引号
这转变了
INSERT INTO tableName (col1,col2,col3,col4,col5,col6,col7,col8) VALUES ('Jan 7 2018 12:33PM', 'R', 'essential-app', '15952008002', 'Jan 7 2018 12:30PM', '0', 'E', NULL);
进入
INSERT INTO tableName (col1,col2,col3,col4,col5,col6,col7,col8) VALUES (STR_TO_DATE('Jan 7 2018 12:33PM', '%b %d %Y %h:%i%p'), 'R', 'essential-app', '15952008002', STR_TO_DATE('Jan 7 2018 12:30PM', '%b %d %Y %h:%i%p'), '0', 'E', NULL);
我冒昧地将格式字符串用单引号引起来。我希望这就是我们的意图。