linux - 整合sed命令

标签 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 命令吗?

编辑 我应该注意到这需要与 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/

相关文章:

linux - 在unix awk中将utc时间戳转换为est

bash - 带有存储在文件中的通配符的 grep

linux - 该内核需要 x86-64 CPU,但仅检测到 i686 CPU

java - 如何以非root用户身份运行Kafka?

linux - 如何使用 bash shell 创建新的启动器?

linux - 打印矩阵的对角线

java - 防止子 JVM 在其父 JVM 退出时退出

linux - 在连续文件名中查找缺失的数字(高级 ls & find)

C++ 简单交互式 shell 重定向输入时隐藏提示

linux - 捕获用户输入以运行脚本