包含控制字符的变量的参数扩展

包含控制字符的变量的参数扩展

我正在寻找替换组分隔符控制字符,该字符由终端打印为“^]”,并且八进制代码为:035,带有空格。

这可以简单地使用 tr 来完成,如下所示echo $line | tr '\035' ' '

但是,我不会(不能)在 bash 脚本中使用外部命令,因此我希望使用参数扩展来用空格替换控制字符。

匹配控制字符的正确语法是什么,以下选项不起作用:

${line//'\035'/' '}
${line//'\0035'/' '}
${line//\035/' '}
${line//$'\035'/' '}

或者是否有另一种方法可以在不使用 tr 和 sed 等外部​​命令的情况下替换字符?

答案1

我认为最后一个应该有效:

$ str=$(printf 'foo\035bar')
$ echo "${str//$'\035'/'X'}"
fooXbar

(尽管我出于通常的原因在扩展周围添加了双引号,并且在 Bash 3.2 中,这使得替换中的单引号最终成为文字)

您还可以将特殊字符放入变量中,然后在 的中间部分使用它${var/pattern/replacement}

$ special=$'\035'
$ str=$'foo\035bar'
$ echo "${str//$special/X}"
fooXbar

答案2

根据记录,这也可以使用 POSIX-shell 语法来实现。通过使用字符$IFS来分割字符串\035,然后将其分割参数与空格连接起来,它可以有效地执行所需的替换。

#!/usr/bin/env sh

str=$(printf 'foo\035bar bar  baz   qux')

# Character \035 as Internal Field Separator
__oIFS=$IFS && IFS=$(printf '\035')

# shellcheck disable=SC2086 # Intended split on \035 into arguments
set -- $str && IFS=$__oIFS

# Expands arguments as space-delimited into $replStr
replStr=$*

printf '%s\n' "$replStr"

相关内容