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