【发布时间】:2017-12-20 00:35:20
【问题描述】:
与其说是正则表达式 模式,不如说是 如何 来实现它。我已经尝试过 perl、sed 和 awk(每种都进行了多次尝试),但我不确定这作为单行代码的可能性有多大(我宁愿不编写 perl 脚本)。
说我有
#MARKER_TOP
INSERT INTO ('col1', 'col2', 'col3')
VALUES
(123,123,'2018-20-20 24:24:24',123)
...etc.
(123,123,'2018-20-20 24:24:24',123);
#MARKER_BOTTOM
...and more! (not all INSERT tables will be marked, btw)
我想做的是用 SQL NOW() 替换所有这些字符串日期。具体来说,对于 Perl,我尝试了以下方法:
perl -w -pi.bak -e "undef $/; s/(#MARKER_TOP.*)'[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]'(.*#MARKER_BOTTOM)/$1 NOW() $2/msg" test.sql
但它完全删除了所有感兴趣的块(#MARKER_TOP 等),并用 NOW() 替换它,这对于我想要的来说过于严厉了。
【问题讨论】:
-
“并非所有 INSERT 表都会被标记”是什么意思?
-
我的意思是其中一些 SQL 语句(即
INSERT INTO...)将没有标记(MARKER_TOP, MARKER_BOTTOM),这个文件长达数千行,包含多个INSERT语句。那些没有标记的,不应该改变日期。
标签: regex perl awk sed command-line