別のファイルを自動的に生成するために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