Você deseja usar limites de palavras
grep '\<Jack\>' file
ou com aspas duplas
grep "\<$name\>" file
Ref: link
Eu tenho uma matriz e, em seguida, o seguinte loop:
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
E o arquivo de entrada seria algo como:
Smith John(johnsmith)
Smith Jane(janesmith)
Bauer Jack(jackbauer)
Long Jackson(jackslo)
Digamos que eu esteja procurando pela string Jack
. O problema é que a saída também incluiria Long Jackson
. Então, preciso que a última parte de [[:blank:]]"$name"
inclua (
.
[[:blank:]]"$name"(*
não funciona devido a um erro de sintaxe.
[[:blank:]]"$name""("*
não funciona devido a parênteses sem correspondência.
[[:blank:]]"$name"\(*
não funciona devido a parênteses sem correspondência.
Como resolvo este problema?
Você deseja usar limites de palavras
grep '\<Jack\>' file
ou com aspas duplas
grep "\<$name\>" file
Ref: link
Para procurar nomes pessoais (primeiros nomes):
$ name=Jack; grep -E "[[:blank:]]$name[(]" file
Bauer Jack(jackbauer)
Para pesquisar apenas nomes de família:
$ name=Bauer; grep -E "^$name[[:blank:]]" file
Bauer Jack(jackbauer)
Para procurar um primeiro nome ou um sobrenome:
$ name=Jack; grep -E "^$name[[:blank:]]|[[:blank:]]$name[(]" file
Bauer Jack(jackbauer)
$ name=Bauer; grep -E "^$name[[:blank:]]|[[:blank:]]$name[(]" file
Bauer Jack(jackbauer)
O ponto-chave da sua solicitação é que a palavra-chave de pesquisa (por exemplo, Jack
) deve estar com (
e pode ter espaço em branco na frente dela, mas não é necessária.
Talvez você possa usar sed
e awk
para resolvê-lo.
Via sed
name='Jack'
sed -r -n '/[[:space:]]*'"${name}"'\(/p' file
Via awk
name='Jack'
awk 'match($0,/[[:space:]]*'"${name}"'\(/){print}' file