首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于匹配一组值的Awk正则表达式

问用于匹配一组值的Awk正则表达式
EN

Unix & Linux用户
提问于 2021-07-01 02:56:48
回答 2查看 1.2K关注 0票数 0

我对awk正则表达式匹配有问题。我试图用正则表达式模式(\"\.\"|0|1)来匹配特定的列。此列只能具有值"."、0或1。但是我的regex模式在awk中并不匹配,而列中的数据是"."。有什么想法吗?

代码

代码语言:javascript
复制
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
EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2021-07-01 06:41:58

如果希望模式在"." (包括引号)、0或1上完全匹配,则需要模式为^("\."|[01])$、^("[.]"|[01])$或^("\."|0|1)$等。

但是,当使用-v将该模式传递给awk时,awk在那里专门对待\ (与-v FS=x类似的-F x也是如此),因此需要在这里转义反斜杠。

最好使用ENVIRON将任意字符串从shell传递到awk,因为这没有这个问题。

所以:

代码语言:javascript
复制
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。

票数 2
EN

Unix & Linux用户

发布于 2021-07-01 05:05:00

尝试将[.01]作为您的模式。

这是一个只匹配.、0和1的括号表达式。

注意:在括号表达式之外,您必须将.转义为\. (否则它将匹配任何字符),但在括号表达式中它将被视为文字.。

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

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

复制
相关文章

相似问题

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