我有一个名为$ 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答案 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'
师。