大文字の前にスペースを追加


8

文字列があります:

AddData
TestSomething
TellMeWhoYouAre

等々。大文字の前にスペースを入れたい。どうすればできますか?


7
大文字が連続している場合はどうしますか?例IClimbALadder
グレン・ジャックマン2017

1
実際、私は次のような文字列を持っていますReadFileFromCDDrive。@ Kusalanandaのソリューションはうまく機能します。
HeroFromEarth 2017

回答:


16

を使用しsed、単語の前にスペースを入れたくない場合:

$ sed 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' file.in
Add Data
Test Something
Tell Me Who You Are

置換は、別の空白以外の文字の直後にある大文字を探し、その2つの間にスペースを挿入します。

のように複数の大文字が連続する文字列の場合WeAreATeam、これはを生成しWe Are ATeamます。これをソートするには、もう一度置換を実行します。

$ sed -e 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' \
      -e 's/\([^[:blank:]]\)\([[:upper:]]\)/\1 \2/g' file.in

1
この回答では、大文字が前にある場合、大文字の前にスペースは追加されません。OPがそのような制限を課さなかったのに、なぜそれをそのように書くのですか?
LarsH 2017

@LarsH修正しました。
クサラナンダ

いいえ、しませんでした。gフラグがあっても、正規表現に一致するものを重ねることはできません。echo ThisIsATest | sed 's/\(.\)\([[:upper:]]\)/\1 \2/g'(コマンド)を試して、機能しない理由を確認してください。
ワイルドカード

@Wildcard Wonkyですが、機能します。BREを使用するより良い提案がありますか?
クサラナンダ

最初はスペースがないと言っているわけではないのでs/[A-Z]/ \0/g、完全に満足できます...本当に気になっている場合は `s / [AZ] / \ 0 / g; s / ^ // '。
Michael Homer

12

Perl、先読みと先読みのゼロ幅正規表現を使用:

$ perl -pe 's/(?<=\w)(?=[A-Z])/ /g'  file.in 

Tell Me Who You Are                    ## TellMeWhoYouAre
I Am A Regular Expression User         ## IAmARegulaExpressionUser

このバージョンでは、連続した大文字も分離されています。


1
このターンReadFileFromUSBDriveRead File From U S B DriveOPが望んでいたのに対しRead File From USB Drive
Kusalananda

1
@Kusalananda、指摘してくれてありがとう。(質問に書かれているのがわかりません)。実際の状況(プログラミングの理解、idワードの拡張、CamelCaseバリアント)では、基本的な基準(単一の大文字またはその逆に分割)を使用し、例外の辞書を使用するのが一般的です。
JJoao 2017

1
申し訳ありませんが、それはOPが私の回答に対するコメントで書いたものでした。私は同意します、ある種の単語リストなしではこれを行うのは難しいです。
Kusalananda


0

Pythonソリューション:

#!/usr/bin/env python
from __future__ import print_function
import sys

with open(sys.argv[1]) as f:
    for line in f:
        for char in line:
            if char.isupper():
               print(" "+char,end="")
            else:
               print(char,end="")

試運転:

$ ./add_space_to_upper.py input.txt                        
 Add Data
 Test Something
 Tell Me Who You Are

あなたは欲しいprint(line[0], end="")続くfor char in line[1:]:各出力行の先頭にその不要なスペースを出力しないようにするために。
Paul Evans、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.