匹配排除以“?”开头的单词的特定单词

Matching a particular word excluding words beginning by "?"

当这个词在 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