如何在Perl脚本中进行正则表达式搜索后附加

时间:2019-03-23 03:37:21

标签: regex perl

我正在尝试将MySQL转储转换为SQLite数据库,以进行数据库迁移。我需要编辑日期以追加时间,因此例如2018-09-19应该转换为2018-09-19 00:00:00.00。这种格式的原因与我们的应用程序的工作方式有关。这是我想出的解决方案,但是没有用。

#!/usr/bin/perl
while (<>){
  <Other Stuff>
  ....
  s/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))\[/$1[00:00:00.00]][/
print;
}

为了测试,我创建了一个test.txt文件,仅用于测试

2019-03-06

在命令行或终端中,我使用以下命令测试该追加是否有效。

 perl -pe  's/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))\[/$1[00:00:00.00]][/' < test.txt > testout.txt

这给出了一个明显的错误:

syntax error at -e line 1, near "00:" Execution of -e aborted due to compilation errors.

使用看起来像这样的@dada解决方案不会出现任何错误,但不会在行尾添加00:00:00.00

预期输出应为

2019-03-06 00:00:00.00

1 个答案:

答案 0 :(得分:1)

您的问题陈述说您想转弯:

2018-09-19

进入:

2018-09-19 00:00:00.00

但是,您的代码是:

s/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))\[/$1[00:00:00.00]][/

使用/x,我们可以这样写得更清楚:

s/
    (
        [12]\d{3}                    # year
        -                            # hyphen
        ( 0[1-9] | 1[0-2] )          # month (saved as $2)
        -                            # hyphen
        ( 0[1-9] | [12]\d | 3[01] )  # day (saved as $3)
    )                                # save this as $1
    \[                               # square bracket 
/$1[00:00:00.00]][/x

由此可见,2018-09-19不匹配,因为它没有以方括号结尾。

替换值为:

$1[00:00:00.00]][

(尝试)说:

  • 数组00:00:00.00中的查找索引@1和替换值
  • 追加][

但是,这不是有效的perl,也不是您想要的。

发生的事情是,perl看到了$x(数组中的值),而不是[y] + $x[y](标量后跟字符串值)。为避免这种情况,请使用花括号(${x}[y])或使括号脱离($x\[y])。结果是:

${1}[00:00:00.00]][

这仍然不是问题所需要的,因为零都放在括号中。

要获得所需的信息,请从搜索部分的末尾除去\[,并从替换部分除去不必要的括号:

s/
    (
        [12]\d{3}
        - ( 0[1-9] | 1[0-2] )
        - ( 0[1-9] | [12]\d | 3[01] )
    )
    # no bracket here
/$1 00:00:00.00/x;  # no brackets here

请注意,您给出的代码还有一个错误,那就是最后一个print必须用分号与s///分开。