제가 작성 중인 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