我正在尝试将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
答案 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///
分开。