制御文字を含む変数のパラメータ拡張

制御文字を含む変数のパラメータ拡張

ターミナルで「^]」として印刷され、8進コード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"

関連情報