Grep 以字符串和括号结尾的字符串

Grep 以字符串和括号结尾的字符串

我有一个数组,然后有以下循环:

for i in "${familyNames[@]}"
do 
  name=`echo "$i"`
  cat $file | grep -E \("$name"[[:blank:]]\|[[:blank:]]"$name"[[:blank:]]\|[[:blank:]]"$name"\) >> .fitnam.log

  nameFem=`echo "$name"ova`
  cat $file | grep -E \("$nameFem"[[:blank:]]\|[[:blank:]]"$nameFem"[[:blank:]]\|[[:blank:]]"$nameFem"\) >> .fitnam.log
done

输入文件将是这样的:

Smith John(johnsmith)
Smith Jane(janesmith)
Bauer Jack(jackbauer)
Long Jackson(jackslo)

假设我正在寻找字符串Jack。问题是输出还会包含Long Jackson。所以我需要的最后部分[[:blank:]]"$name"包含(

[[:blank:]]"$name"(*由于语法错误而无法工作。

[[:blank:]]"$name""("*由于括号不匹配而不起作用。

[[:blank:]]"$name"\(*由于括号不匹配,因此不起作用。

我该如何解决这个问题?

答案1

您想使用单词边界

grep '\<Jack\>' file

或使用双引号

grep "\\<$name\\>" file

参考:https://www.gnu.org/software/gnulib/manual/html_node/grep-regular-expression-syntax.html#grep-regular-expression-syntax

答案2

要搜索个人姓名(名字):

$ name=Jack; grep -E "[[:blank:]]$name[(]" file
Bauer Jack(jackbauer)

仅搜索姓氏:

$ name=Bauer; grep -E "^$name[[:blank:]]" file
Bauer Jack(jackbauer)

要搜索名字或姓氏:

$ name=Jack; grep -E "^$name[[:blank:]]|[[:blank:]]$name[(]" file
Bauer Jack(jackbauer)
$ name=Bauer; grep -E "^$name[[:blank:]]|[[:blank:]]$name[(]" file
Bauer Jack(jackbauer)

答案3

您的请求的关键点是搜索关键字(例如Jack)必须以 结尾(,并且前面可以有空格,但不是必须的。

也许您可以使用sedawk来解决它。

通过 sed

name='Jack'
sed -r -n '/[[:space:]]*'"${name}"'\(/p' file

通过 awk

name='Jack'
awk 'match($0,/[[:space:]]*'"${name}"'\(/){print}' file

相关内容