我正在寻找替换组分隔符控制字符,该字符由终端打印为“^]”,并且八进制代码为: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"