예를 들어 작은따옴표가 포함된 변수가 있는데 a'b
, 이를 파일에 쓰기 전에 두 개의 작은따옴표로 바꿔야 합니다 a''b
.
다음 bash 코드는 나를 위해 작업을 수행하는 데 사용됩니다 ...
line="a'b"
echo "${line//\'/\'\'}" > out.txt
...오늘까지는 사용된 bash 버전에 따라 다른 출력을 발견했습니다.
- GNU bash, 버전 4.3.48(1)-릴리스(x86_64-pc-linux-gnu):
a''b
- GNU bash, 버전 4.2.46(2)-릴리스(x86_64-redhat-linux-gnu):
a\'\'b
위 줄을 다양한 방법으로 수정해 보았지만 a''b
두 bash 쉘 모두에서 동일한 출력을 생성할 수는 없습니다.
echo
결국 및 의 조합을 사용하게 되었습니다 sed
.
echo "$(echo $line | sed "s/'/''/g")" > out.txt
하지만 작업을 수행하기 위해 더 간결하고 순수한 bash 표현을 사용할 수 있는지 알고 싶습니다. 그럴 수 있어?
답변1
중 하나다양성bash-4.3-alpha와 이전 버전 bash-4.2-release 사이:
패턴 대체 단어 확장을 사용할 때 bash는 이제 문자열 내의 따옴표가 이스케이프 문자로 작동하도록 허용하므로 따옴표를 제거하여 대체 문자열을 실행합니다. 이는 이전 버전과 호환되지 않으므로 bash 호환성 모드를 4.2로 설정하여 비활성화할 수 있습니다.
입력하다:
BASH_COMPAT=4.2
line="a'b"
echo "${line//\'/''}"
산출:
a''b
답변2
버전(및 이를 지원하는 ksh93 및 이를 지원하는 mksh 및 zsh와 같은 셸 구현)에 관계없이 작동하는 방법의 경우 패턴과 대체를 변수에 저장할 수 있습니다.
pattern="'"
replacement="''"
printf '%s\n' "${line//$pattern/$replacement}"
또는
q="'"
printf '%s\n' "${line//$q/$q$q}"
(다른 쉘에서는 가 zsh
고정 $pattern
문자열로 처리됩니다. 와일드카드 패턴으로 처리하려면(와일드카드가 포함되지 않으므로 여기에는 적용되지 않음 ) 로 $pattern
바꿔야 합니다 . 다른 쉘에서는 고정 문자열로 처리 하려면 문자열을 따옴표( )로 묶어야 합니다.$pattern
$~pattern
$pattern
${line//"$pattern"/$replacement}