查找大写的小写字符串并放在大写字符串之前

查找大写的小写字符串并放在大写字符串之前

我有一个 bash 脚本从网页中读取名称作为变量,该脚本使用 LASTNAME Firstname 格式:

SANCHEZ Rick
SMITH Morty
VAN SOMETHING Halen

但是,我需要将每个名称显示为名字姓氏:

Rick SANCHEZ
Morty SMITH
Halen VAN SOMETHING

我正在寻找一种方法来识别小写大写的名字并将其放在大写姓氏之前。

我得到的最接近的是

echo $eachname | awk '{ for (i=NF; i>1; i--) printf("%s ",$i); print $1; }'

然而,这个命令会把有两个姓氏的人搞乱:

Rick SANCHEZ
Morty SMITH
Halen SOMETHING VAN

答案1

sed给定两个或多个姓氏和名字,这可能是一种可能性:

SANCHEZ Rick Ignatius Alexander
SMITH Morty
FOO VAN SOMETHING Halen

命令;

sed 's/^\([^a-z]*\)[[:blank:]]\(.*\)$/\2 \1/' file

输出:

Rick Ignatius Alexander SANCHEZ
Morty SMITH
Halen FOO VAN SOMETHING

告诉我这是否适合你。

答案2

sed或者将中间名保留在末尾的替代方法

这个输入

SANCHEZ Rick
SMITH Morty
VAN SOMETHING Halen
MCSMITH Some Body

有了这个

sed -E "s/^([A-Z ]+) ([A-Z][a-z]+)(.*)/\2 \1\3/" file1

给出这个输出

Rick SANCHEZ
Morty SMITH
Halen VAN SOMETHING
Some MCSMITH Body

相关内容