[英]difficult string to replace in script using SED
我知道,許多人對如何使用sed替換字符串有疑問,但是我在這里遇到了一個難題。
我有一個文件,需要替換一個提示用戶輸入內容的文本字符串。 我想使它自動化,以便用戶不進行交互。 通過用靜態文件路徑替換此字符串。 但是文本是bash腳本,並且要替換的字符串中包含“和”。它不起作用。要么是因為我的格式出現語法錯誤,要么根本無法使用sed執行此操作。請咨詢!
這是我要嘗試做的事情:我想替換這個長字符串
read -e -p 'Enter path for Boot Partition : ' BOOTUSERFILEPATH
帶有如下所示的字符串:
BOOTUSERFILEPATH=../board-support/prebuilt-images
我的嘗試:
sed -i "/read -e -p 'Enter path for Boot Partition : ' BOOTUSERFILEPATH/BOOTUSERFILEPATH="../board-support/prebuilt-images"" file_to_search.sh
更新:我已修復語法錯誤,但文件仍未使用新的路徑信息進行更新... :(
發現了問題。 由於我的搜索命令中有多余的空格,搜索未找到字符串。 現在可以使用!
字符串中有正斜杠,因此需要使用其他的斜杠。 在這里我用'|' 作為分隔符。
sed "s|read -e -p \'Enter path for Boot Partition : \' BOOTUSERFILEPATH|BOOTUSERFILEPATH=../board-support/prebuilt-images|g" oldfile > newfile
您可能會注意到sed的-i
選項(允許在適當位置編輯文件)不是POSIX支持的選項。
但是,如果您想使用它:
sed -i "s|read -e -p \'Enter path for Boot Partition : \' BOOTUSERFILEPATH|BOOTUSERFILEPATH=../board-support/prebuilt-images|g" oldfile
您可能會發現,使用帶有sed
的模式更容易,該模式與該字符串的一部分匹配,然后替換其全部內容:
sed 's|read -e -p .* BOOTUSERFILEPATH|BOOTUSERFILEPATH=../board-support/prebuilt-images|g' filename > newfilename
從sed
的POSIX規范頁面:
s/BRE/replacement/flags
將替換字符串替換為模式空間中BRE的實例。 可以使用<backslash>
或<newline>
以外的任何字符代替斜杠來分隔BRE和替換。
您需要使用實際的替代命令,並且需要避免替換文本中的斜杠使sed
混淆。 就個人而言,我可能會使用:
sed -i.bak "s%^read .* BOOTUSERFILEPATH$%BOOTUSERFILEPATH=../board-support/prebuilt-images%" file_to_search.sh
甚至更有可能:
BOOTUSERFILEPATH="../board-support/prebuild-images"
sed -i.bak "s%^read .* BOOTUSERFILEPATH$%BOOTUSERFILEPATH=$BOOTUSERFILEPATH%" file_to_search.sh
s%%%
使用%
代替/
來分隔命令的各個部分。 我欺騙了匹配模式,並假設文件中沒有很多相似的行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.