Text-Processing
使用 korn 腳本替換變數中所有出現的字元
我正在編寫的 Korn 腳本的一部分要求我將所有出現的
'
字元替換為兩次出現 (''
)。我正在嘗試將我在此腳本中生成的一些 SQL 記錄到另一個表中的列中,但需要將單引號替換為單引號字元的 2 個實例。我知道某處必須有此功能的範例,但我沒有在任何地方找到特定於變數的字元串替換範例。
有什麼特別的原因你不能
sed
從你的ksh
腳本中呼叫嗎?這個簡單的腳本:
#!/bin/ksh foo="left ' right" echo $foo foo=$(echo "$foo" | sed "s#\'#\'\'#g") echo $foo
給我這個輸出:
left ' right left '' right
在 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")'"