awk替换多线perl替换操作

时间:2018-03-12 15:59:40

标签: bash perl awk

我使用此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

1 个答案:

答案 0 :(得分:4)

通过linewise工作,你不会得到同样的效果吗?这会绕过"长字符串"正则表达式错误:

perl -ne 'print unless /^--.*TABLE DATA; Schema: pgq;/ .. ($_ eq "\\.\n")'

我们一次处理一行输入(-n)。我们打印每一行,除非我们在一个要剥离的块中。

.. operator(在标量上下文中)跟踪我们的状态(我们是否应该跳过)。可跳过区域的开始由条件/^--.*TABLE DATA; Schema: pgq;/标记(即与当前行匹配的正则表达式);可跳过区域的末尾标有$_ eq "\\.\n"(即一行包含\.)。