2012-05-24 90 views
1

嗯,我有以下格式一系列內容幾個文件:匹配空格字符的正則表達式

[abc]   #4 *5 
[pqr]   #3 *4 
[xyx]   #5 *2 

現在我需要通過更換的

[xyx]   #3 *2 

所有次數

[xyx]   #1 *2 

在所有文件中。

現在引起疼痛的問題是[xyz]和#3之間存在空間。有兩件事我正在一個腳本這個搜索表達式作爲命令行參數,它看起來是這樣的:

searchExp=$1 
repalaceExp=$2 

echo $searchExp 
echo $replaceExp 

for i in `grep \'$searchExp\'` 
do 
sed 's/$searchExp/$replaceExp' $i > $i.new 
done 

我想這應該是罰款因爲我傳遞的參數爲:

./replace_script '^\[xyz\]   #3' '\[xyz\]   #1' 

現在你看到的回聲statment INT腳本減少在搜索所有的空間和relace表現爲單個空格

\[xyz\] #3 

現在我嘗試一些其他的替代照顧空格字符

1. ^\[xyz\][ ]+#3 

這是一個尖叫不平衡[],所以正則表達式錯誤

2. ^\[xyz\]\s+#3 //as per few suggestion on SO 

這一點兒也不匹配。

你能看到我要去哪裏嗎?

編輯:糾正錯別字

+0

空格可以用'[:space:]' – elias

回答

0

echo總是降低的空間,所以不要在其輸出計數。

你真正缺少的是這樣的:

sed 's/searchExp/replaceExp' $i > $i.new 

其實應該

sed "s/$searchExp/$replaceExp/" $i > $i.new 

如果你想確保你真正匹配的線,你可以寫echo(或更好,printf)在for循環內。

最後,如果你想上的所有文件使用sed和替換就地,你可以這樣寫:

searchExp=$1 
repalaceExp=$2 

sed -i "s/$searchExp/$replaceExp/" * 
+1

來匹配雙引號.. – Kevin

+0

哎呀!這是一個錯字。我正在使用sed的/ $ searchExp/$ replaceExp /'。我糾正了這個問題。謝謝! – mawia

+0

也爲你的疑問,我想通過$ i> $ i.new來做什麼是默認的sed不要在現場替換,而是打印在std o/p上,我試圖捕獲它在一個新的文件。希望這就說得通了。 – mawia

4

一個更好的辦法是使用正則表達式有一個反向引用像這樣:

searchExp='\(\[xyx\][[:space:]]*\)#5' 
replaceExp='\1#1' 
sed "s/$searchExp/$replaceExp/" <<%EOF% 
[abc]   #4 *5 
[pqr]   #3 *4 
[xyx]   #5 *2 
%EOF% 
[abc]   #4 *5 
[pqr]   #3 *4 
[xyx]   #1 *2 

還要注意,您需要雙引號才能擴展變量。