Bash RegEx и сохранение команд в переменную - PullRequest
0 голосов
/ 31 октября 2019

в Bash У меня есть массив names, который содержит строковые значения

Dr. Praveen Hishnadas
Dr. Vij Pamy
John Smitherson,Dr.,Service Account
John Dinkleberg,Dr.,Service Account

Я хочу захватить только имена

Praveen Hishnadas
Vij Pamy
John Smitherson
John Dinkleberg

и сохранить их обратно в исходный массив, перезаписывая их неанизированные версии.

У меня есть следующий фрагмент кода обратите внимание, что я выполняю регулярное выражение в Perl (-P)

for i in "${names[@]}"
do
        echo $i|grep -P  '(?:Dr\.)?\w+ \w+|$' -o | head -1

done

Что приводит квывод

Dr. Praveen Hishnadas
Dr. Vij Pamy
John Smitherson
John Dinkleberg

Вопросы:

1) Я неправильно использую команду просмотра ?:? Я пытаюсь по желанию подобрать «доктора»не захватывая его

2) Как мне сохранить результат этого эха обратно в имена массивов? Я попытался установить его на

i=echo $i|grep -P  '(?:Dr\.)?\w+ \w+|$' -o | head -1

i=$(echo $i|grep -P  '(?:Dr\.)?\w+ \w+|$' -o | head -1)

i=`echo $i|grep -P  '(?:Dr\.)?\w+ \w+|$' -o | head -1`

, но безрезультатно. Я только начал изучать bash 2 дня назад и чувствую, что мой синтаксис немного отключен. Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 31 октября 2019

Ваш взгляд говорит "включай Dr., если он там". Возможно, вам нужен негативный взгляд наподобие (?!Dr\.)\w+ \w+. Я добавлю ведущий \b якорь и бонус.

names=('Dr. Praveen Hishnadas' 'Dr. Vij Pamy' 'John Smitherson,Dr.,Service Account' 'John Dinkleberg,Dr.,Service Account')

for i in "${names[@]}"
do
        grep -P  '\b(?!Dr\.)\w+ \w+' -o <<<"$i" |
        head -n 1
done

Не имеет значения для приведенных вами примеров, но вы должны в основном всегда указывать свои переменные. См. Когда обернуть кавычки вокруг переменной оболочки?

Может быть, также Google "Программисты лжи верят в имена".

Чтобы обновить массив,зацикливание на индексах массива и присвоение обратно в массив.

for((i=0;i<${#names[@]};++i)); do
    names[$i]=$(grep -P  '\b(?!Dr\.)\w+ \w+|$' -o <<<"${names[i]}" | head -n 1)
done
0 голосов
/ 31 октября 2019

Как насчет этого для регулярного выражения?

(?:^|\.\s)(\w+)\s+(\w+)

Regex Demo

(?:             # Non-capturing group
   ^|\.\s       # Start match if start of line or following dot+space sequence
)
(\w+)           # Group 1 captures the first name
\s+             # Match unlimited number of spaces between first and last name (take + off to match 1 space)
(\w+)           # Group 2 captures surname.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...