korn 스크립트를 사용하여 변수에 나타나는 모든 문자 바꾸기

korn 스크립트를 사용하여 변수에 나타나는 모든 문자 바꾸기

제가 작성 중인 Korn 스크립트의 일부에서는 '문자( '')의 모든 항목을 두 개의 문자 항목으로 바꿔야 합니다. 이 스크립트에서 생성된 일부 SQL을 다른 테이블의 열에 기록하려고 하는데 작은따옴표를 작은따옴표 문자의 인스턴스 2개로 바꿔야 합니다. 이 기능의 예가 어딘가에 있을 것이라는 것을 알고 있지만 변수별 문자열 대체 예는 어디에서도 찾지 못했습니다.

답변1

${VARIABLE//PATTERN/REPLACEMENT}ksh93 및 zsh에는 다음 코드 조각에서 두 번 사용되는 문자열 대체 구성이 있습니다 . 한 번은 '로 대체 ''하고 한 번은 newline 으로 대체합니다 '+char(10)+'. 입력 문자열에 개행 문자가 없으면 두 번째 할당 명령을 생략할 수 있습니다.

quoted_string=\'${raw_string//\'/\'\'}\'
quoted_string=${quoted_string//$'\n'/"'+char(10)+'"}

이 구조는 bash에서도 사용할 수 있지만 인용 규칙은 다릅니다. 다음 코드 조각은 모든 ksh93, bash 및 zsh에서 작동합니다.

quoted_string=\'${raw_string//$'\''/$'\'\''}\'
quoted_string=${quoted_string//$'\n'/$'\'+char(10)+\''}

ksh88 및 기타 셸에서는 작은따옴표를 한 번에 하나씩 바꾸려면 상대적으로 복잡한 루프를 작성해야 합니다. 다음 코드 조각은 작은따옴표를 두 배로 늘리지만 개행 문자는 변경하지 않고 그대로 둡니다.

q="$raw_string"; quoted_string=
while
    quoted_string="$quoted_string'${q%%\'*}'"
    case "$q" in *\'*) q="${q#*\'}";; *) false;; esac
do :; done

또는 sed를 사용할 수도 있습니다. echo인수가 항상 있는 그대로 인쇄되지는 않으므로 sed에 데이터를 공급할 때 주의하세요 .

quoted_string="'$(printf '%s\n' "$raw_string" |
                  sed -n -e "s/'/''/g" -e 'H' \
                      -e '$ g' -e 's/^\n//' -e "s/\\n/'+char(10)+'/g" -e '$ p')'"

문자열에 개행 문자가 없으면 다음과 같은 간단한 sed 명령으로 충분합니다.

quoted_string="'$(printf '%s\n' "$raw_string" | sed -e "s/'/''/g")'"

답변2

스크립트 sed에서 호출을 할 수 없는 특별한 이유가 있나요 ?ksh

이 간단한 스크립트는 다음과 같습니다.

#!/bin/ksh

foo="left ' right"
echo $foo
foo=$(echo "$foo" | sed "s#\'#\'\'#g")
echo $foo

나에게 다음과 같은 출력을 제공합니다.

left ' right
left '' right

관련 정보