簡體   English   中英

將變量傳遞給sed命令

[英]passing variables to sed command

我試圖在腳本中運行以下內容。 它基本上在TXT之后用定義變量附加TXT_NEW。 運行包含在小bash腳本中的腳本會引發錯誤:

sed:-e表達式#1,char 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

感謝有人可以看看並提供一些指示......

首先,你有雙重引用的問題。 外雙引號內的單引號正在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 append命令,您可以考慮使用append from file命令 r <filename> ,如下所示:

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

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

你應該做它推廣的另一件事是處理sed在“搜索字符串”可變正則表達式元字符$TXT ,通過轉義\\/& 也許通過輔助函數escape()

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM