删除特定上下文中的字符(使用 shell 脚本)

删除特定上下文中的字符(使用 shell 脚本)

所以,我有一个包含名称列表的文件,例如

Thomas Newbury
Calvin Lewis
E. J. Frederickson
Lamar Wojcik
J.C. Lily
Lillian Thomas

我最终会尝试将它们分成一长串名字和姓氏,但在这样做之前,我想将“EJ”变成“EJ”,但我不知道如何做到这一点用bash。

我知道"[A-Z]+. [A-Z]+."匹配“EJ”,但我不知道什么命令允许我仅在两个点字母之间的上下文中删除空格?

答案1

我认为这适用于 GNU sed

sed -E 's/^([A-Z]+\.)[[:blank:]]([A-Z]+\.)/\1\2/' file

答案2

我认为 sed 是你最好的选择,这是我的版本:

sed -r ':a;s/^(.*\.)(\ )+(.\.)(.*)$/\1\3\4/;t a' file

-r -- use extended regular expressions
:a -- label "a" 
^(.*\\.) -- 1st group matches any character "." from the line beginning up to a literal "\\.".   
(\ )+ -- 2nd group matches white space (+ is one or more) 
(.\.) -- 3rd group matches the next letter 
(.*)$ -- 4th group matches to the end of the line
;t a -- if the previous substitution did something then branch to label "a"
/\1\2\4/ -- replaces the matches with groups 1,3,4 removing the space 

这可以处理任意缩写,例如:SOV Sovereign

相关内容