我使用此Perl命令来删除数据库转储的块。它从包含字符串TABLE DATA; Schema: pgq;
的注释行开始,稍后在一行上以字符序列\.
结束。所有匹配都将被删除。
perl -p0e 's/\n--[^\n]*TABLE DATA; Schema: pgq;.*?\n\\\.\n//gs'
除非由于perl bug that's been fixed in 5.22处理大于几千兆字节的数据库转储,否则此方法有效。我坚持使用Perl 5.18(Ubuntu 14.04),升级不是一种选择。
我正在考虑使用awk以及-vRS
和-vORS
变量以及可能的gsub
运算符重写Perl表达式,但我似乎找不到任何示例用例。是不是有可能用awk?
我正在使用GNU Awk 4.0.1
。
答案 0 :(得分:4)
通过linewise工作,你不会得到同样的效果吗?这会绕过"长字符串"正则表达式错误:
perl -ne 'print unless /^--.*TABLE DATA; Schema: pgq;/ .. ($_ eq "\\.\n")'
我们一次处理一行输入(-n
)。我们打印每一行,除非我们在一个要剥离的块中。
..
operator(在标量上下文中)跟踪我们的状态(我们是否应该跳过)。可跳过区域的开始由条件/^--.*TABLE DATA; Schema: pgq;/
标记(即与当前行匹配的正则表达式);可跳过区域的末尾标有$_ eq "\\.\n"
(即一行包含\.
)。