제어 문자가 포함된 변수의 매개변수 확장

제어 문자가 포함된 변수의 매개변수 확장

터미널에서 "^]"로 인쇄되고 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"

관련 정보