2015-10-07 45 views
0

我知道,很多人對如何使用sed替換字符串都有疑問,但我在這裏遇到了困難。使用SED替換腳本中的難字符串

我有一個文件,我需要替換提示用戶輸入內容的文本字符串。我想將其自動化,以便用戶不會互動。通過用靜態文件路徑替換該字符串。但是文本是一個bash腳本,並且在我想要替換的字符串中包含「and」,它不起作用,因爲我在格式化時遇到了語法錯誤,或者根本無法用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 

更新:我固定的語法錯誤,但文件仍然不會更新與新的路徑信息... :(

發現了這個問題。搜索沒有找到字符串,因爲我的搜索命令有額外的空間。它現在有效!

+0

您錯過了's'命令來執行替換,並且您的引用字符串中有雙引號。 – Barmar

+0

而且,由於'/'是's'的分隔符,所以您需要避開路徑中的斜線或選擇不同的分隔符。 –

+0

你是否真的需要經常這樣做,以至於需要自動化? – chepner

回答

2

您的字符串中有正斜槓,所以需要使用不同的delmiter。在這裏我使用'|'作爲分隔符。

sed "s|read -e -p \'Enter path for Boot Partition : \' BOOTUSERFILEPATH|BOOTUSERFILEPATH=../board-support/prebuilt-images|g" oldfile > newfile 

您可能注意到,-i選項的sed允許文件就地編輯是不是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和替換。

+0

@喬納森。這是一個很好的開始!謝謝!我嘗試了你的例子,它不會出錯,但是,編輯的輸出文件是空白的!你認爲我在這裏做錯了什麼? – DavidScott612

+0

@喬納森。好吧,我試過你給你的第一個例子。它執行沒有錯誤,創建「newfile」。然而,newfile與舊的沒有什麼不同。該輸入字符串仍然在那裏。我在這裏錯過了什麼? – DavidScott612

+0

好像你的數據有一些差異。嘗試限制三個分隔符「|||」之間的初始模式即; 「|限制這種模式||」 –

1

您需要使用實際的替代命令,並且您需要避免替換文本中的斜槓混淆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%%%使用%而不是/來分隔命令的部分。我欺騙了匹配模式,假設文件中沒有許多類似的行。

+0

實際上,我將要處理的腳本在其中有5個這種字符串模式的實例,只有輕微的變化,提示短語和路徑變量名稱。所以這就是我選擇使用整個字符串行的原因。 – DavidScott612

+0

好的;將額外的字符添加到模式中,以便進行正確的更改。 –