使用Perl在Bash中执行RegEx

tv6aics1  于 2023-06-25  发布在  Perl
关注(0)|答案(2)|浏览(138)

在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`

但无济于事。我2天前才开始学习bash,我觉得我的语法有点不对。任何帮助都很感激。

iq3niunx

iq3niunx1#

你的前瞻显示“如果它在那里,请包括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

对于你提供的例子来说,这并不重要,但是你应该基本上总是引用你的变量。参见When to wrap quotes around a shell variable?
Google "falsehoods programmers believe about names".
要更新数组,请循环遍历数组索引并将其赋值回数组。

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

14ifxucb2#

对于正则表达式来说,这样的东西怎么样?

(?:^|\.\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.

相关问题