使用 korn 脚本替换变量中出现的所有字符

使用 korn 脚本替换变量中出现的所有字符

我正在编写的 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

是否有任何特殊原因导致您无法sedksh脚本中进行调用?

这个简单的脚本:

#!/bin/ksh

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

给我这个输出:

left ' right
left '' right

相关内容