kornスクリプトを使用して変数に表示されるすべての文字を置き換える

kornスクリプトを使用して変数に表示されるすべての文字を置き換える

私が作成しているKornスクリプトの一部では、'文字('')のすべての項目を2つの文字項目に置き換える必要があります。このスクリプトで生成された一部のSQLを別のテーブルの列に書き込もうとしていますが、一重引用符を一重引用符文字の2つのインスタンスに置き換える必要があります。この機能の例がどこかにあることはわかっていますが、変数固有の文字列置換の例はどこにも見つかりませんでした。

答え1

${VARIABLE//PATTERN/REPLACEMENT}ksh93とzshには、次のコードスニペットで2回使用される文字列置換構成があります。一度'はで置き換え''、一度はnewlineで置き換えます'+char(10)+'。入力文字列に改行文字がない場合は、2番目の割り当てコマンドを省略できます。

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やその他のシェルでは、単一引用符を一度に1つずつ置き換えるには、比較的複雑なループを作成する必要があります。次のコードは一重引用符を2倍にしますが、改行文字は変更せずに残します。

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

関連情報