我有一个数组,然后有以下循环:
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
答案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
)必须以 结尾(
,并且前面可以有空格,但不是必须的。
也许您可以使用sed
和awk
来解决它。
通过 sed
name='Jack'
sed -r -n '/[[:space:]]*'"${name}"'\(/p' file
通过 awk
name='Jack'
awk 'match($0,/[[:space:]]*'"${name}"'\(/){print}' file