gpt4 book ai didi

regex - 在两个标记字符串之间的字符串中查找/替换正则表达式模式

转载 作者:行者123 更新时间:2023-12-02 09:18:00 24 4
gpt4 key购买 nike

与其说是正则表达式模式,不如说是如何实现它。我尝试过 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

但是它完全撕掉了所有感兴趣的 block (#MARKER_TOP等)并用NOW()替换它,这对于我想要什么。

最佳答案

一个简单的方法是使用 range operator

use warnings;
use strict;

my $file = 'test.sql';
open my $fh, '<', $file or die "Can't open $file: $!";

my $re_date = qr/'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'/;

while (<$fh>)
{
if (/#MARKER_TOP/ .. /#MARKER_BOTTOM/) {
s/$re_date/NOW()/;
}

print;
}

或者单行

perl -wpe"s/'\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}'/NOW()/ 
if /#MARKER_TOP/ .. /#MARKER_BOTTOM/
" test.sql

我用 "..." 分隔代码,以便能够在内部使用 ' (还有其他方法)。

我假设一行中有一个日期,其格式严格按照问题中给出的格式,在 '' 内。我通过添加另一个 INSERT 部分进行测试,但没有标记。替换仅发生在标记括号中。


范围运算符通过保持状态来工作:一旦其左操作数变为 true,它就变为 true,并保持 true 直到右操作数变为 true,之后在下一次迭代中返回 false。它在标量上下文中以这种方式工作,而在列表上下文中它返回该范围内的列表。请参阅链接文档。

关于regex - 在两个标记字符串之间的字符串中查找/替换正则表达式模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45110924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com