微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

匹配特定单词,但不包括以“?”开头的单词

如何解决匹配特定单词,但不包括以“?”开头的单词

当这个单词也以CSV文件内的问号开头时,我很难找到该单词的匹配方式。我需要使用tcsh代码

我的意思是我可以匹配“ cat”,但不包括“ zcat”,但其中包括“?cat”。这是我的代码

#!/bin/tcsh -f
set viewSet = PRE_IMPL
set nbViewSet=`awk -F ";" '{ for (i=1; i<=NF; i++) { if ($i == "VIEW SETS") print i } }' csv.csv`
/usr/bin/awk -F ";" -v col="$nbViewSet" '(match($col,'"/\<"$viewSet"\>/"') != 0) {print}' csv2.csv

因此,使用此代码,我将得到以下内容作为输入CSV文件

STANDARD KEYS;COMPATIBLE KEYS;CELL KEY;COND KEY;WORKSPACE PATH;VIEW PATH;CATEGORIES;CONDS SECTION;VIEW SETS;TYPES
;;;;;;;;PRE_IMPL;
;;;;;;;;zPRE_IMPL;
;;;;;;;;?PRE_IMPL;
;;;;;;;;PRE_IMPL;

所以在这里我只想匹配单词“ PRE_IMPL”,而不匹配“ zPRE_IMPL”或“?PRE_IMPL”。我的代码设法排除了“ zPRE_IMPL”,但没有排除“?PRE_IMPL”,并且我没有设法改变它,输出为:

;;;;;;;;PRE_IMPL;
;;;;;;;;?PRE_IMPL;
;;;;;;;;PRE_IMPL;

如何更改代码以仅匹配“ PRE_IMPL”?

解决方法

您可以使用诸如(^|[^?])PRE_IMPL之类的正则表达式来要求匹配项位于字段的开头或非问号字符旁边。

根据需要,这里不必两次运行Awk。 (或者在一个地方使用/usr/bin/awk,在另一个地方使用awk。)

awk -F ";" -v viewSet="$viewSet" '
  NR==1{ for (i=1; i<=NF; i++) if ($i == "VIEW SETS") col=i; next }
  match($col,"(^|[^?])" viewSet "\>")' csv2.csv

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。