sed を使用して、単一の大文字の後のスペースを削除します。

sed を使用して、単一の大文字の後のスペースを削除します。

別のファイルを自動的に生成するためにbashスクリプトを作成していますが、特定の方法でいくつかの文字列をフォーマットする必要があります。特に私が経験した最後の問題は、個々の大文字と大文字で始まる単語を含む文字列をフォーマットすることでした。たとえば、

O S D Settingsする必要がありますOSD Settings

最初のスペースを削除するsedコマンドがありますが、「D」(例:O S D Settings-> OS Settings)も削除します。このコマンドは次のとおりです。

O S D Settings | sed 's/ \([A-Z]\)* \(A-Za-z]*\)/\1/g'

文字を失うことなく個々の大文字間のスペースを削除する方法を知っている人はいますか?

ベストアンサー1

これはA B Chadwick次の名前を処理します。A B C D'Souza

A B cdeなどのテキストA B CDEは変更されません。

2 つの一時的な null 文字を使用して\x00行の変更を名前で表示し、スペースを削除します。

:Nそして:S分岐するラベル(どんな名前でも可能)
tで、b分岐コマンドです。
t前のコマンドで交換が成功した後に分岐しますs/../../
b無条件分岐。

sed -r ":N                                                # loop per name
         /(\<[A-Z]\> )+[A-Z][a-z']/{                      # line needs action
             s/((\<[A-Z]\> )+)([A-Z][a-z'])/\x00\1\x00\3/ # add \x00 markers
            :S                                            # loop per space
             s/(\x00[A-Z]+) (\<[A-Z]\>)/\1\2/             # delete a space
             t S                                          # any more spaces? 
             b N                                          # any more names?
         }; s/\x00//g"                                    # remove \x00

おすすめ記事