使用 sed 在每行添加多个字符串的前缀和后缀

使用 sed 在每行添加多个字符串的前缀和后缀

我有一个 .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);

我冒昧地将格式字符串用单引号引起来。我希望这就是我们的意图。

相关内容