【问题标题】:get first letter of words using sed使用 sed 获取单词的第一个字母
【发布时间】:2011-12-13 03:45:34
【问题描述】:

我需要一个 bash 脚本来打印名称的第一个字母。示例:Ruben Van Den Bosshe 成为 RVDB 或 Ken Van de Wilde 成为 KVdW

我想使用 sed 命令。

【问题讨论】:

    标签: linux bash scripting sed command


    【解决方案1】:

    这可能有一种更简洁的方法,但以下方法似乎可行:

    $ echo 'Ken Van de Wilde' | sed 's/\(\w\)\w*\( \|$\)/\1/g'
    KVdW
    $ echo 'Ruben Van Den Bosshe' | sed 's/\(\w\)\w*\( \|$\)/\1/g'
    RVDB
    

    为了稍微分解一下这个正则表达式,它依次匹配以下内容:

    • 一个单词的一个字母,第一组抓到:\(\w\)
    • 零个或多个字母:\w*
    • 最后,空格或行尾:\( \|$\)

    该序列将替换为第一组中捕获的任何内容:\1

    【讨论】:

    • 对空白使用 \w 标志是 GNU sed 的矫揉造作,一般不会起作用。
    • @Ahmed Masud:很公平,但标签表明 OP 使用的是 Linux,所以如果他/她没有使用 GNU sed,我会感到非常惊讶......
    【解决方案2】:

    这应该在 sed 的所有 POSIX 实现中兼容:

    echo "Someone Is Watching" | sed 's/\([^[:space:]]\)[^[:space:]]*[[:space:]]*/\1/g'
    SIW
    

    【讨论】:

    • 这并不适用于所有实现。 POSIX sed 不需要 \t 是一个选项卡,这是一个 GNU 扩展。因此,如果您不使用 GNU,您更有可能获得 SIWc,而 \t 被视为只是一个 t。您需要一个显式选项卡才能使其与基于 BSD 的 sed 一起使用,例如在 Mac OS X 上。
    • 啊,你是...我犯了同样的错误,我要求避免...呸:-) ...虽然很难在这里注入。好的,所以我会让它符合 POSIX 标准...... :)
    【解决方案3】:
    $ echo 'Ken Van de Wilde' | sed 's/\B\w*//g;s/\s//g'
    KVdW
    

    【讨论】:

    • +1 我想这是我第一次看到使用非单词边界标记。优雅。
    【解决方案4】:

    Kev 的回答可以稍微改进一下:

    echo 'K Van de Wilde' | sed 's/\B.//g;s/\s//g'
    

    如果所有单词都是两个或更多字符,甚至缩短为:

    echo 'Ken Van de Wilde' | sed 's/\B.\s*//g'
    

    如果有人知道如何提取单个字母单词的特殊情况并将其合并到上述正则表达式中,我会很感兴趣。

    【讨论】:

      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 2017-12-06
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多