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

Ben*_*Ben 4 ksh shell-script text-processing sql

我正在编写的 Korn 脚本的一部分要求我'用两次出现 ( '')替换所有出现的字符。我试图将我在此脚本中生成的一些 SQL 记录到另一个表中的列中,但需要用单引号字符的 2 个实例替换单引号。我知道某处一定有此功能的示例,但我没有找到特定于任何地方的变量的字符串替换示例。

Gil*_*il' 7

在 ksh93 和 zsh 中,有一个字符串替换构造${VARIABLE//PATTERN/REPLACEMENT},在以下代码段中使用了两次:一次替换''',一次替换换行符'+char(10)+'。如果输入字符串中没有换行符,则可以省略第二个赋值命令。

quoted_string=\'${raw_string//\'/\'\'}\'
quoted_string=${quoted_string//$'\n'/"'+char(10)+'"}
Run Code Online (Sandbox Code Playgroud)

这个构造也可以在 bash 中使用,但引用规则不同。以下代码段适用于所有 ksh93、bash 和 zsh。

quoted_string=\'${raw_string//$'\''/$'\'\''}\'
quoted_string=${quoted_string//$'\n'/$'\'+char(10)+\''}
Run Code Online (Sandbox Code Playgroud)

在ksh88等shell中,需要写一个比较复杂的循环,一次替换一个单引号。以下代码段将单引号加倍,但换行符保持不变)。

q="$raw_string"; quoted_string=
while
    quoted_string="$quoted_string'${q%%\'*}'"
    case "$q" in *\'*) q="${q#*\'}";; *) false;; esac
do :; done
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用 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')'"
Run Code Online (Sandbox Code Playgroud)

如果字符串中没有换行符,则以下更简单的 sed 命令就足够了。

quoted_string="'$(printf '%s\n' "$raw_string" | sed -e "s/'/''/g")'"
Run Code Online (Sandbox Code Playgroud)