在大写字母之前添加空格


8

我有一个字符串:

AddData
TestSomething
TellMeWhoYouAre

等等。我想在大写字母之前添加空格。我该怎么做?


7
如果有连续的大写字母,您想做什么?例如IClimbALadder
glenn jackman '02

1
其实我有一个像这样的字符串ReadFileFromCDDrive,@Kusalananda的解决方案效果很好。
HeroFromEthth

Answers:


16

使用sed,并假设您不希望在单词前加空格:

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

替换将在另一个非空白字符之后立即寻找大写字母,并在两者之间插入一个空格。

对于具有多个连续大写字符的字符串,例如WeAreATeam,将产生We Are ATeam。要对此进行排序,请再次运行替换:

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

1
如果答案在大写字母之前,则不会在大写字母前添加空格。当OP对它没有任何限制时,为什么要这样写呢?
LarsH

@LarsH修复了它。
Kusalananda

不,你没有。即使有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,使用lookbehind和lookahead零宽度正则表达式:

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

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

此版本还分隔连续的大写字母。


1
这将打开ReadFileFromUSBDrive进入Read File From U S B Drive,而OP通缉Read File From USB Drive
库萨兰达

1
@Kusalananda,感谢您指出。(恐怕我没有看到问题中写的内容)。在实际情况下(编程理解,id单词扩展和CamelCase变体),通常使用基本条件(分为单个大写字母或相反字母)并具有例外字典。
JJoao

1
抱歉,这是OP在我的答案评论中写的。我同意,没有某种单词表很难做到这一点。
库沙兰丹


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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.