Text-Processing

使用 korn 腳本替換變數中所有出現的字元

  • August 4, 2011

我正在編寫的 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")'"

引用自:https://unix.stackexchange.com/questions/17996