私が作成している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