regex 按字面意义匹配正则表达式元字符[已关闭]

vh0rcniy  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(144)

**已关闭。**此问题为not reproducible or was caused by typos。目前不接受答复。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
2天前关闭。
Improve this question
我对正则表达式在AWK中的理解是,为了从字面上匹配正则表达式的元字符(例如:+,$,^,*,etc)你必须转义它们,像这样:

awk -F '\\+' 'program here'

但是我注意到,对于某些元字符,例如“+”,实际上并不需要这样做。
输入文件:

this|is|a|line
this+is+a+line
this?is?a?line
this*is*a*line
this$is$a$line
this.is.a.line

AWK程序:

#!/usr/bin/awk -f
BEGIN { FS = "+|^"}

{print $1,$2,$3,$4 }

预期输出(由于未转义+):

this|is|a|line
this+is+a+line
this?is?a?line
this*is*a*line
this$is$a$line
this.is.a.line

实际产量:

this|| is|| a|| line
his|is|a|line
this is a line
his?is?a?line
his*is*a*line
his$is$a$line
his.is.a.line

我不明白这是怎么回事。我没有转义元字符(使其字面意义),但AWK无论如何都匹配成功,这是在给AWK公然的错误代码?
我有一本“AWK编程语言”,所以我浏览了Regex的部分,以确保我没有发疯,它陈述了以下内容:
在匹配表达式中,像“^[0-9]+$”这样的带引号的字符串通常可以与包含在斜杠中的正则表达式(例如/^[0-9]+$/)互换使用。但有一个例外。如果引号中的字符串要匹配正则表达式元字符的字面值,则需要一个额外的反斜杠来保护保护反斜杠本身。那就是
$0 ~ /(+|- )[0-9]+/

$0 ~“(+|- )[0-9]+”
是等价的。
这种行为看起来《双城之战》,但它的出现是因为awk在解析带引号的字符串时删除了一层反斜杠保护。如果需要在元字符前面使用反斜杠来关闭其在正则表达式中的特殊含义,则该反斜杠需要前面的反斜杠来保护它在字符串中的位置。
有人能解释一下我错过了什么吗

lh80um4z

lh80um4z1#

+位于模式的开始:它不能修改之前的任何内容(即,允许前面有1个或多个不存在的字符),因此awk将其解释为文字+字符,而不是修饰符。
来自gawk手册,在regex operator details
在POSIX awk和gawk中,'*'、'+'和'?'运算符在其前面的regexp中没有任何内容时代表它们自己。例如,/+/匹配文字加号。但是,许多其他版本的awk将这种用法视为语法错误。

相关问题