合并sed命令

时间:2012-09-20 05:24:11

标签: linux shell unix sed ksh

我有一个名为$ 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命令吗?

EDIT 我应该注意到这需要与HP / SOL / LIN

兼容POSIX

2 个答案:

答案 0 :(得分:2)

使用tr

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

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

此特定命令将第一组(C)的a-zA-Z0-9实现中的每个字符转换为第二组中的字符;由于第二组仅包含空格,因此将所有非字母数字字符(包括制表符)转换为空格。然后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

答案 1 :(得分:1)

试试这个:

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

师。