带正则表达式的 Sed 命令:“未终止的正则表达式”。正则表达式的最大长度?

问题描述 投票:0回答:1

我尝试使用很长的正则表达式执行 sed 命令

但我收到错误

sed: 1: "/LOCK TABLES .(long_tab ...": 未终止的正则表达式

long_regex='/LOCK TABLES .(long_table_name_here_01|long_table_name_here_02|long_table_name_here_03|long_table_name_here_04|long_table_name_here_05|long_table_name_here_06|long_table_name_here_07|long_table_name_here_08|long_table_name_here_09|long_table_name_here_10|long_table_name_here_11|long_table_name_here_12|long_table_name_here_13|long_table_name_here_14|long_table_name_here_15|long_table_name_here_16|long_table_name_here_17|long_table_name_here_18|long_table_name_here_19|long_table_name_here_20|long_table_name_here_21|long_table_name_here_22|long_table_name_here_23|long_table_name_here_24|long_table_name_here_25|long_table_name_here_26|long_table_name_here_27|long_table_name_here_28|long_table_name_here_29|long_table_name_here_30|long_table_name_here_31|long_table_name_here_32|long_table_name_here_33|long_table_name_here_34|long_table_name_here_35|long_table_name_here_36|long_table_name_here_37|long_table_name_here_38|long_table_name_here_39|long_table_name_here_40|long_table_name_here_41|long_table_name_here_42|long_table_name_here_43|long_table_name_here_44|long_table_name_here_45|long_table_name_here_46|long_table_name_here_47|long_table_name_here_48|long_table_name_here_49|long_table_name_here_50|long_table_name_here_51|long_table_name_here_52|long_table_name_here_53|long_table_name_here_54|long_table_name_here_55|long_table_name_here_56|long_table_name_here_57|long_table_name_here_58|long_table_name_here_59|long_table_name_here_60|long_table_name_here_61|long_table_name_here_62|long_table_name_here_63|long_table_name_here_64|long_table_name_here_65|long_table_name_here_66|long_table_name_here_67|long_table_name_here_68|long_table_name_here_69|long_table_name_here_70|long_table_name_here_71|long_table_name_here_72|long_table_name_here_73|long_table_name_here_74|long_table_name_here_75|long_table_name_here_76|long_table_name_here_77|long_table_name_here_78|long_table_name_here_79|long_table_name_here_80|long_table_name_here_81|long_table_name_here_82|long_table_name_here_83|long_table_name_here_84|long_table_name_here_85|long_table_name_here_86|long_table_name_here_87|long_table_name_here_88|long_table_name_here_89|long_table_name_here_90|long_table_name_here_91|long_table_name_here_92|long_table_name_here_93|long_table_name_here_94|long_table_name_here_95|long_table_name_here_96|long_table_name_here_97|long_table_name_here_98|long_table_name_here_99|long_table_name_here_100). WRITE;/,/^UNLOCK TABLES;/d'

echo 'teststring' | sed "$long_regex"

如果我减少正则表达式的长度,就没有问题。所以我假设有最大长度之类的。 有什么想法吗?

我使用的是 Mac,我的 sed 版本是 13.4.1

macos sed
1个回答
0
投票

我想我发现 sed 在我的 Mac 上有限制:

https://www.gnu.org/software/sed/manual/sed.html#Limitations

8 GNU sed 的限制和非限制 对于那些想要编写可移植 sed 脚本的人,请注意,已知某些实现会将行长度(模式和保留空间)限制为不超过 4000 字节。 POSIX 标准指定符合要求的 sed 实现应支持至少 8192 字节的行长度。 GNU sed 对行长度没有内置限制;只要它可以 malloc() 更多(虚拟)内存,您就可以根据需要提供或构造行。
但是,递归用于处理子模式和无限重复。这意味着可用的堆栈空间可能会限制某些模式可以处理的缓冲区的大小。

© www.soinside.com 2019 - 2024. All rights reserved.