我正在编写的 Korn 脚本的一部分要求我用'
两次出现的字符替换所有出现的字符 ( ''
)。我正在尝试将在此脚本中生成的一些 SQL 记录到另一个表中的列中,但单引号需要替换为单引号字符的 2 个实例。我知道某个地方一定有此功能的示例,但我没有在任何地方找到特定于变量的字符串替换示例。
答案1
在 ksh93 和 zsh 中,有一个字符串替换构造${VARIABLE//PATTERN/REPLACEMENT}
,在以下代码片段中使用了两次:一次用于替换'
为''
,一次用于替换换行符'+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和其他shell中,您需要编写一个相对复杂的循环来一次替换一个单引号。以下代码片段将单引号加倍,但换行符保持不变)。
q="$raw_string"; quoted_string=
while
quoted_string="$quoted_string'${q%%\'*}'"
case "$q" in *\'*) q="${q#*\'}";; *) false;; esac
do :; done
或者,您可以使用 sed。将数据提供给 sed 时要小心,因为echo
并不总是按原样打印其参数。
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