【问题标题】:help - sed - insert space between any string of form XxxXxx, without replacing the patternhelp - sed - 在任何形式的 XxxXxx 字符串之间插入空格,而不替换模式
【发布时间】:2011-05-29 05:01:08
【问题描述】:

如果字符串是模式 XxxXyzAbc...
sed 的预期输出必须是 Xxx Xyz Abc ...

例如:如果字符串是QcfEfQfs,那么预期的输出是Qcf Ef Efs.

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

有没有办法在不替换模式的情况下插入空格?

请帮助。谢谢。

【问题讨论】:

    标签: shell unix sed design-patterns


    【解决方案1】:

    使用匹配组。

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

    【讨论】:

      【解决方案2】:

      一种更准确的模式匹配 - 对非 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。

      【讨论】:

      • 您缺少右方括号。您的命令在 OP 的“QcfEfQfs”上失败。
      • @Dennis:drat - 是的。我在我测试的版本中修复了它;在添加答案之前忘记更改代码。打扰了,是的,我错过了 QcfEfEfs 示例...我想知道连续多少个小写字母...
      【解决方案3】:

      这可能对你有用(GNU sed):

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

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

      【讨论】:

        猜你喜欢
        • 2023-02-04
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 2018-04-07
        • 2016-08-21
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        相关资源
        最近更新 更多