在awk中,sub()和gsub()函数的第一个参数、match()函数的第二个参数和split()的可选第三个参数是一个扩展正则表达式。
这样的参数可以是任意表达式,其计算结果可以是被解释为正则表达式的字符串,也可以是正则表达式常量。
在awk中,正则表达式常量是为某些正则表达式RE ( awk语法中的"ERE令牌“)编写的。
问题:假设RE保持不变(一些非变量正则表达式),那么在调用(例如,sub() )时使用/RE/和使用"RE" ( awk语法中的"STRING令牌“)有什么实际区别吗?或者:在对上述函数的调用中,这两种表示正则表达式的方法之间是否有任何已知的awk实现不同?
问这个问题的原因是,我还记得必须修改一些awk代码,这些代码试图在调用sub()或gsub()时使用"RE"作为正则表达式,因为无论出于什么原因,手头的awk实现做了错误的事情,除非我用/RE/调用函数。
不幸的是,这是很久以前的事情了(2+年),所以我不记得细节,甚至不知道当时我使用的是什么Unix (可能是OpenBSD),但从那以后我就一直想问这个问题。
发布于 2023-01-17 17:16:24
是的,在所有awk实现中,反斜杠作为转义符的方式是不同的。有关此及更多详细信息,请参见https://www.gnu.org/software/gawk/manual/gawk.html#Computed-Regexps:
..。请注意,用斜杠括起来的regexp常量和用双引号括起来的字符串常量是有区别的。如果要使用字符串常量,则必须理解字符串本质上是扫描两次的:第一次是awk读取程序,第二次是将运算符左侧的字符串与右边的模式相匹配。对于任何字符串值表达式(如前面示例中所示的digits_regexp ),这都是正确的,而不仅仅是字符串常量。如果对字符串进行两次扫描,会有什么不同?答案与转义序列有关,特别是反斜杠。要将反斜杠输入到字符串中的正则表达式中,必须键入两个反斜杠。例如,
/\*/是文字*的regexp常量。只需要一个反斜杠。要对字符串执行相同的操作,必须键入"\\*"。第一个反斜杠转义第二个反斜杠,以便字符串实际上包含两个字符\和*。
因此,在编写regexp时,唯一考虑使用"RE"而不是/RE/的时间是:
/s,没有转义,因此您可以编写,例如,sub("/foo/bar","")而不是sub(/\/foo\/bar/,""),仅仅是为了简洁,或者var=17; sub("stuff" var,"")。否则,总是在regexp周围使用regexp分隔符(/),而不是字符串分隔符(")。
https://unix.stackexchange.com/questions/732115
复制相似问题