我对awk正则表达式匹配有问题。我试图用正则表达式模式(\"\.\"|0|1)来匹配特定的列。此列只能具有值"."、0或1。但是我的regex模式在awk中并不匹配,而列中的数据是"."。有什么想法吗?
代码
awk -F "$delimitter" -v n="$column" -v m="$pattern" 'NR!=1 && $n !~ "^" m "$" {
printf "%s:%s:%s\n", FILENAME, FNR, $n > "/dev/stderr"
count++
}
END {print count+0}' input.txt 2>> errors.log发布于 2021-07-01 06:41:58
如果希望模式在"." (包括引号)、0或1上完全匹配,则需要模式为^("\."|[01])$、^("[.]"|[01])$或^("\."|0|1)$等。
但是,当使用-v将该模式传递给awk时,awk在那里专门对待\ (与-v FS=x类似的-F x也是如此),因此需要在这里转义反斜杠。
最好使用ENVIRON将任意字符串从shell传递到awk,因为这没有这个问题。
所以:
pattern='"\."|0|1'
PATTERN=$pattern DELIMITER=$delimiter awk -v n="$n" '
BEGIN {FS = ENVIRON["DELIMITER"]; m = ENVIRON["PATTERN"]}
$n ~ "^(" m ")$" {...}'(仍然使用-v作为n,因为这些都是不带反斜杠的数字)。
注意上面的(,)。^x|y$在开始时要么是x,要么在末尾是y。
发布于 2021-07-01 05:05:00
尝试将[.01]作为您的模式。
这是一个只匹配.、0和1的括号表达式。
注意:在括号表达式之外,您必须将.转义为\. (否则它将匹配任何字符),但在括号表达式中它将被视为文字.。
https://unix.stackexchange.com/questions/656503
复制相似问题