Shell-Script

對變數使用 sed 命令

  • April 21, 2017

我已經嘗試了 Stack Overflow 及其相關網站上所有可能的解決方案,但沒有找到任何解決方案。我在這個問題上花了相當多的時間,終於發布了這個問題。

我想將該sed命令與 shell 變數一起使用。我的腳本很簡單:

## string to replace is the text after comma in the variable pc.
to_replace=${pc#*,}
echo $to_replace

##text to be replaced by the following line
replace_with="PARTITIONED BY ($pc1);"
echo $replace_with

## use sed command to replace.
sed "s@$to_replace@$replace_with@" $entry  ## $entry is the variable that contains the file name

這兩個echo命令分別給出以下輸出:

PARTITIONEDED BY (date_key );  ## the text I want to be replaced
PARTITIONED BY ( date_key int );  ## the text I want to replace with

我要麼得到一個錯誤:

sed: -e expression #1, char 2: unterminated `s' command

或者文本根本不會被替換。

有人請幫忙。我正在使用 Centos 6(如果重要的話)。提前致謝!

sed: -e expression #1, char 2: unterminated `s' command

錯誤消息說錯誤發生在第二個字元上,這看起來很奇怪。我可以通過在第一個變數的開頭添加換行符來重現這一點:

$ a=$'\nfoo'
$ b='bar'
$ sed "s@$a@$b@"
sed: -e expression #1, char 2: unterminated `s' command

未轉義的換行符終止 sed 命令。稍後放入換行符a當然會給後面的字元帶來錯誤。

您確實在腳本的前面列印出了這兩個變數,但它們沒有被引用,因此它們中的任何前導空格都將被刪除,中間的空格將顯示為單個空格。

檢查您的變數實際包含的內容,如下所示:

printf ">%s<\n" "$to_replace"
printf "%q\n" "$to_replace"

後者是一個 Bash 功能,它以 Bash 接受作為輸入的方式顯示引用的字元串。set -x還會顯示 sed 命令行的內容,但您需要注意其輸出中的文字換行符。

因此,如果只有一個前導換行符,您可以在腳本的開頭將其刪除:

to_replace=${pc#*,}
to_replace=${to_replace#$'\n'}

(您可以將它們合二為一,但即使沒有換行符,也可以使用單獨的步驟。)

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