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

问题描述

当这个单词也以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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...