使tr仅替换参数中给定的确切字符

  • 本文关键字:字符 tr 替换 参数 unix tr
  • 更新时间 :
  • 英文 :


我试图转换文件名以删除不可接受的字符,但tr并不总是完全按照给定的方式处理其输入参数。

例如:

$ echo "(hello) - {world}" | tr '()-{}' '_'
_______ _ _______

虽然我只想替换()-{},但按ASCII排序规则,){之间的所有字符也都被替换了——所以输入中的每个字母也变成了_

有没有办法让tr只替换其参数中给定的确切字符?

tr的语法异常复杂。它支持范围、字符类、基于排序规则的等价匹配等。

为了避免意外(当字符串意外匹配任何语法时(,我们可以将文字字符转换为这些字符的序数的###八进制说明符字符串:

trExpressionFor() {
printf %s "$1" | od -v -A n -b | tr ' ' '\'
}
trL() { # name short for "tr-literal"
tr "$(trExpressionFor "$1")" "$(trExpressionFor "$2")"
}

用作:

$ trExpressionFor '()-{}'
505155173175
$ echo "(hello) - {world}" | trL '()-{}' '_'
_hello_ _ _world_

最新更新