help - sed - 在任何形式的XxxXxx字符串之间插入空格,而不替换模式

时间:2010-12-22 03:59:50

标签: shell unix sed design-patterns

如果字符串的格式为 XxxXyzAbc ...
来自sed的预期出局必须是 Xxx Xyz Abc ......

例如:如果字符串为 QcfEfQfs ,则预期输出为 Qcf Ef Efs。

如果我尝试用空格替换 [az] [AZ] 模式,那么sed会用空格替换字符或模式,例如 Qc f fs。 < / p>

有没有办法在不更换图案的情况下插入空间?

请帮助。谢谢。

3 个答案:

答案 0 :(得分:6)

使用匹配组。

$ sed 's/\([a-z]\)\([A-Z]\)/\1 \2/g' <<< 'XxxXyzAbc'
Xxx Xyz Abc

答案 1 :(得分:0)

更准确的模式匹配 - 对于不是XxxYyyZzz格式的字符串上的伪匹配更少 - 是:

sed 's/\([A-Z][a-z][a-z]*\)\([A-Z][a-z][a-z]*\)\([A-Z][a-z][a-z]*\)/\1 \2 \3/'

考虑输入:

XxxYyyZzz
xxxYyyZzz
X xY yZ z

我看到的另一个答案是在所有字符串中插入空格 - 它应该只修改第一个字符串。

更新以允许QcfEfEfs示例 - 从问题中不清楚一行中允许多少个小写字母。它可能是1或2;或者它可以是1或更多 - 使用*允许1或更多;否则,请将\{1,2\}用于1或2。

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed 's/\B[[:upper:]]/ &/g' file

查找非单词边界,后跟大写字符,并在整个行中插入空格。