我想做的是:有一個文件,裡面有一行(它肯定會在那裡,100%)在這個模型中:
name_of_the_value=xxx
值在哪裡數值和 未知由我來說,因為它在設備和設備之間發生變化...我需要以某種方式獲取該xxx
值並將其替換為用戶通過 a 給出的另一個值TextField
(我為此使用Java,它適用於Android 應用程序,但它無論如何都是純 shell 腳本)。
已驗證:
- 尋找並刪除整行並替換為整行,例如刪除
name_of_the_value=xxx
並替換為name_of_the_value=user_value
- 僅替換
xxx
(值)部分 - 用“#”註釋任何現有的匹配行,並將整行寫入文件底部
但是我該如何使用echo
,sed
或者awk
如果我不知道它的值呢?
答案1
假設 user_value 部分始終為 3 個字元長,您可以這樣做:
sed "s/name_of_the_value=.{0,3}/name_of_the_value=$new_value/"
或者,如果您確定該行後面沒有任何內容,您也可以使用:
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/"
我希望我的正規表示式是正確的,我不是這方面的專家。因此,該值應該始終為3 個字元長,最好採用十六進位格式,因為在低於100 的情況下,十進位並不總是3 個字元長。也應該有效,但它假設整個部分name_of_the_value=user_value
都在自己的一條線。現在在終端機中進行測試,第二種情況的輸出如下所示:
video@NAUTH:~$ echo "name_of_the_value=xxx" | sed "s/name_of_the_value=.*/name_of_the_value=$USER/"
name_of_the_value=video
當然,您需要將輸出透過管道傳回檔案中,或使用臨時檔案進行交換。你可以使用:
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file | sponge /input_file
sed 僅在讀取文件時更改輸出,而不是寫入文件,sponge 會保存輸出,直到完成並將更改寫回。
如果您不想或不能使用海綿,請在第二個檔案中寫入,然後像下面的命令鏈一樣切換它們。
sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file > /output_file
rm -v /input_file
mv -v /output_file /input_file
正如 @kos 在評論中指出的,您也可以使用命令-i
的標誌sed
寫回輸入文件,而不使用臨時文件或sponge
:
sed -i "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file