特定のコンテキストから文字を削除する(シェルスクリプトを使用)

特定のコンテキストから文字を削除する(シェルスクリプトを使用)

したがって、次の名前のリストを含むファイルがあります。

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

私は最終的にそれらを名前と姓の長いリストに分けようとします。しかし、その前に「EJ」を「EJ」に変えたいのですが、bashで何をすべきかわかりません。

「EJ」と一致することはわかっていますが、2"[A-Z]+. [A-Z]+."点文字の間のコンテキストからのみスペースを削除できるコマンドは何であるかわかりません。

答え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)。

関連情報