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

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

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

3 ответа3

0

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

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

Виа Сед

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

Через awk

name='Jack'
awk 'match($0,/[[:space:]]*'"${name}"'\(/){print}' file
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)
0

Вы хотите использовать границы слов

grep '\<Jack\>' file

или с двойными кавычками

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

Ссылка: https://www.gnu.org/software/gnulib/manual/html_node/grep-regular-expression-syntax.html#grep-regular-expression-syntax

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .