1

我有一个名为 $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 兼容

4

2 回答 2

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
于 2012-09-20T05:37:22.350 回答
1

尝试这个:

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

大师。

于 2012-09-20T05:31:45.707 回答