首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >/RE/ V.awk中的RE

/RE/ V.awk中的RE
EN

Unix & Linux用户
提问于 2023-01-17 14:44:58
回答 1查看 464关注 0票数 9

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),但从那以后我就一直想问这个问题。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 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/的时间是:

  1. RE包含/s,没有转义,因此您可以编写,例如,sub("/foo/bar","")而不是sub(/\/foo\/bar/,""),仅仅是为了简洁,或者
  2. 您需要字符串分隔符来连接,如var=17; sub("stuff" var,"")

否则,总是在regexp周围使用regexp分隔符(/),而不是字符串分隔符(")。

票数 11
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/732115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档