我试图转换文件名以删除不可接受的字符,但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 '()-{}'
50 51 55173175
$ echo "(hello) - {world}" | trL '()-{}' '_'
_hello_ _ _world_