2012-03-06 73 views
0

我需要一些sed正則表達式替換的幫助。用sed捕獲空格

從以下行:

 
Provides   mysql     

我想:

 
Provides   mysql-5.5     

最好的解決辦法,我能夠跟的是:

 
sed -i "s/\(Provides\)\(\s\)*\(mysql\)/\1\2mysql-5.5/g" my_file_containing_the_line 

但結果是不是我想要的:

 
Provides mysql-5.5     

這是不完美的,因爲我失去了間 「提供了」 和 「的mysql-5.5」

感謝

回答

4
"s/\(Provides\)\(\s\)*\(mysql\)/\1\2mysql-5.5/g" 

\2組不包含所有空格

"s/\(Provides\)\(\s*\)\(mysql\)/\1\2mysql-5.5/g"將工作。

$> echo "Provides   mysql" | sed "s/\(Provides\)\(\s*\)\(mysql\)/\1\2mysql-5.5/g" 
Provides   mysql-5.5 

旁邊,您可以使用--regexp-extended選項來抑制多餘的轉義:

$> echo "Provides   mysql" | sed --regexp-extended "s/(Provides)(\s*)(mysql)/\1\2mysql-5.5/g" 
Provides   mysql-5.5 

甚至

$> echo "Provides   mysql" | sed --regexp-extended "s/(Provides\s*)(mysql)/\1\2-5.5/g" 
Provides   mysql-5.5 
+1

它的工作原理。感謝--regexp-extended選項來抑制無聊逃跑。 – redochka 2012-03-06 22:12:38

4

更改這個空格:

\(\s\)* 

這樣:

\(\s*\) 

這樣捕獲組包含所有的\s*,而不僅僅是一個單獨的\s。 (隨着\(\s\)*,捕獲組最終只包含的最後一個空白字符。)

其實,對於這個問題,你可以將所有的捕捉組,並寫出兩種:

sed -i 's/\(Provides\s*\)mysql/\1mysql-5.5/g' my_file_containing_the_line 

或:

sed -i 's/\(Provides\s*mysql\)/\1-5.5/g' my_file_containing_the_line 
+0

感謝。我喜歡你的變化。對不起,我不能接受多個回覆。我正在投票。 – redochka 2012-03-06 22:13:39

+0

但爲什麼你不投票我的回答? :(((((( – 2012-03-06 22:16:56

+0

Dude,它不是*全部*關於代表 – 2012-03-07 00:17:53

0

這可能爲你工作:

echo "Provides   mysql    " | sed '/^Provides/s/mysql/&-5.5/' 
Provides   mysql-5.5