我有2個bash腳本變數的定義:
THELINENUMBER="14" # 一個任意的行號,來自一個單獨的命令。
NEWLINE="a line/ with@ special! characters<" # 具有特殊字符的任意行,來自單獨的命令。
我需要使用行號${THELINENUMBER}來替換一個名為after.txt的檔案中的一行${NEWLINE}。
我如何做到這一點呢?
這些是我試過的一些例子:
sed -i '${THELINENUMBER}s#.*#"/"${NEWLINE}"/" after.txt
sed -i "${THELINENUMBER}s#. *#"/"${NEWLINE}"/"" after.txt
sed -i "${THELINENUMBER}s/.*/'${newLINE}'" after.txt
sed -i '${THELINENUMBER}s,.*,${NEWLINE}' after.txt
有人告訴我,分界符通常是/,但這些都存在于我的行替換變數中,所以我不能使用這些。我試著用#和,,但期望的行為沒有改變。我還被告知,"和'應該被用來關閉文本中的轉義(使用字面字串),但我也沒能讓它發揮作用。我如何在sed中傳遞一個有特殊字符的字串引數?我在想,我是否應該將變數${NEWLINE}傳入另一個內置函式呼叫,在傳入sed之前添加轉義字符或其他東西。sed是合適的工具嗎?我在CLI手冊中并沒有找到很多有用的資訊。我使用Ubuntu 18.04.
我在互聯網搜索中參考了這些資料:
我在互聯網搜索中參考了這些資料。
https://stackoverflow.com/questions/11145270/how-to-replace-an-entire-line-in-a-text-file-by-line-number
https://askubuntu.com/questions/76808/how-do-i-use-variables-in-a-sed-command
https://stackoverflow.com/questions/37372047/find-a-line-with-a-string-and-replace-entire-line-with-another-line
uj5u.com熱心網友回復:
使用c(改變)命令。
順便說一下,常規shell變數的命名規則不是ALLCAPS,因為這可能導致與特殊變數如PATH的意外碰撞。
sed "$linenumber c
$newline" 檔案
uj5u.com熱心網友回復:
嘗試
sed -i "${THELINENUMBER}s#.*#${NEWLINE}#"/span> after.txt
這樣做的原因是:
- 你需要用
"括住整個sed命令,而不是用backtick,這樣變數就會被展開 - 在變數中不需要其他引號或回車鍵來轉義
",因為沒有任何東西:變數中沒有字面(轉義)引號 。
- 由于
NEWLINE變數內有/,所以需要一個替代的分隔符(例如#)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/324764.html
標籤:
上一篇:Bash檢查訂單上不匹配的字串
