在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,我觉得我的语法有点不对。任何帮助都很感激。
2条答案
按热度按时间iq3niunx1#
你的前瞻显示“如果它在那里,请包括
Dr.
”。你可能想要一个像(?!Dr\.)\w+ \w+
这样的负向前看。我会扔在一个领先的\b
锚一个奖金。对于你提供的例子来说,这并不重要,但是你应该基本上总是引用你的变量。参见When to wrap quotes around a shell variable?
Google "falsehoods programmers believe about names".
要更新数组,请循环遍历数组索引并将其赋值回数组。
14ifxucb2#
对于正则表达式来说,这样的东西怎么样?
Regex Demo