Grep строки, заканчивающиеся строкой и скобкой

0

У меня есть массив, а затем следующий цикл:

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"\(* не работает из-за несоответствующих скобок.

Как мне решить эту проблему?

Hichigaya Hachiman
источник

Ответы:

0

Для поиска личных имен (имен):

$ 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)
John1024
источник
0

Ключевым моментом вашего запроса является то, что поисковое ключевое слово (например Jack) должно заканчиваться (, и может иметь пробел перед ним, но не обязательно.

Может быть, вы могли бы использовать sedи awkрешить это.

Виа Сед

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

Через awk

name='Jack'
awk 'match($0,/[[:space:]]*'"${name}"'\(/){print}' file
Горгона
источник