簡體   English   中英

使用SED在腳本中難以替換的字符串

[英]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.

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