【问题标题】:Consolidate sed command合并 sed 命令
【发布时间】:2012-09-12 10:59:18
【问题描述】:

我有一个名为 $string 的字符串

string='-d $DESTDIR/ERRORS/$BASEDIR ]] || $MKDIR -p     word1 word22   word3.5'

目前我通过 sed 管道传输了两次。一次拉出特殊字符,然后再次将空格/制表符更改为单个空格。

echo $string | sed 's/[^a-zA-Z0-9]/ /g' | sed 's/\s\s*/ /g'
output='d DESTDIR ERRORS BASEDIR MKDIR p word1 word22 word3 5'

虽然这可行,但我希望获得一些效率。 有人可以帮我把它整合到一个 sed 命令中吗?

编辑 我应该注意到这需要与 HP/SOL/LIN 的 POSIX 兼容

【问题讨论】:

    标签: linux shell unix sed ksh


    【解决方案1】:

    使用tr:

    echo $string | tr -Cs a-zA-Z0-9 ' '
    

    tr 是一个非常强大(且快速)的工具,用于翻译、删除和压缩字符。

    此特定命令将第一组 (a-zA-Z0-9) 的 Complement 中的每个字符转换为第二组中的字符;由于第二组只包含一个空格,这会将所有非字母数字字符(包括制表符)转换为空格。然后s将第二个字符集中的所有字符序列压缩成一个字符;这会用单个空格替换一系列空格。

    例子:

    $ string='-d $DESTDIR/ERRORS/$BASEDIR ]] || $MKDIR -p     word1 word22   word3.5'
    $ output=$(echo $string | tr -Cs 'a-zA-Z0-9' ' ')
    $ echo $output
    d DESTDIR ERRORS BASEDIR MKDIR p word1 word22 word3 5
    

    【讨论】:

    • 从未使用过 tr...那个 posix 兼容吗?
    • 是的,来自man trtr 实用程序符合 IEEE Std 1003.1-2001 (``POSIX.1'')。
    • 经过更多测试后,它在我的 HP 或 Solaris 机器上不喜欢“C”。我尝试了“c”,但没有产生相同的结果。
    【解决方案2】:

    试试这个:

    echo $string | sed -r 's/[^[:alnum:]]/ /g;s/ +/ /g'
    

    大师。

    【讨论】:

    • [[:alnum:]] 是区域敏感的。
    • 我的sed 没有-r...你可以不用那个来写吗?
    • -r 是合并空格所必需的...我在 HP 或 SOL 上也没有这个
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2014-08-22
    • 2014-08-21
    • 1970-01-01
    • 2015-01-30
    • 2015-01-29
    • 2012-06-05
    相关资源
    最近更新 更多