bash: 작은 따옴표를 문자열에서 두 개의 따옴표로 바꿉니다.

bash: 작은 따옴표를 문자열에서 두 개의 따옴표로 바꿉니다.

예를 들어 작은따옴표가 포함된 변수가 있는데 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}

관련 정보