我有一个名为 $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 兼容
最佳答案
使用tr
:
echo $string | tr -Cs a-zA-Z0-9 ' '
tr
是一个非常强大(且快速)的翻译、删除和压缩字符的工具。
此特定命令将第一组 (a-zA-Z0-9
) 的C
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
关于linux - 整合sed命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12506500/