2017-07-11 215 views
2

我正試圖在腳本中運行以下代碼。它基本上是在TXT和定義變量之後附加TXT_NEW。運行包裹在一個小bash腳本的腳本引發錯誤:將變量傳遞給sed命令

的sed:-e表達#1,焦炭1:未知命令:'「」

#!/bin/bash 

user="Alpine" 
new_user="Volverine" 
file_name=file.txt 

TXT="This Text is by $user" 
TXT_NEW="This is owned by $new_dev" 

sed -i "'/$TXT/a ${TXT_NEW}'" $file 

爲了排查我呼應的sed使用命令如下:

echo sed -i "'/$TXT/a ${TXT_NEW}'" $file 

,我看到的變量正確擴大這樣的:

sed -i '/This Text is by Alpine/a This is owned by Volverine' file.txt 

欣賞如果有人可以看看並提供一些指針...

+1

嘗試刪除雙引號內的單引號...和錯字,它應該是'「$ FILE_NAME」''沒有$ file' – Sundeep

+2

可能的[如何使用變量重複在sed中](https://stackoverflow.com/questions/17851521/how-to-use-variables-in-sed) – shellter

回答

1

首先,你有雙引號的問題。外部雙引號內部的單引號使sed失敗,因爲它將第一個字符'視爲無效命令。

所以,只要刪除那些你所提供的例子應該工作:

#!/bin/bash 
user="Alpine" 
new_user="Volverine" 
file_name="file.txt" 

TXT="This Text is by $user" 
TXT_NEW="This is owned by $new_user" 

sed -i "/$TXT/a ${TXT_NEW}" "$file_name" 

然而,由於您的問題是關於傳遞變量文本sed附加命令,你可以考慮使用從文件命令r <filename>追加,像這樣:

sed -i "/$TXT/r /dev/stdin" $file_name <<<"$TXT_NEW" 

r命令類似於a(附加文本),但它從指定的文件中讀取要附加的文本。如果我們說要從/dev/stdin(應該在bash中工作)讀取,我們可以通過here-string提供文本。

你應該做一概而論這是逃避\/&來處理你的「搜索字符串」變量$TXTsed正則表達式元字符的另一件事。也許通過一個輔助功能escape()

escape() { 
    sed 's/[^^]/[&]/g; s/\^/\\^/g' <<<"$1"; 
} 
sed -i "/$(escape "$TXT")/r /dev/stdin" $file_name <<<"$TXT_NEW"