2012-08-11 59 views
1

工作可正常工作:不能獲得分組與SED

輸入文件src.txt:

ffmpeg -i uno.3gp 
ffmpeg -i dos.3gp 
ffmpeg -i tres.3gp 

命令:

sed 's/-i .*\./XXX/' <src.txt 

結果正如預期的那樣:

ffmpeg XXX3gp 
ffmpeg XXX3gp 
ffmpeg XXX3gp 

那麼爲什麼不按預期工作:

COMMAND:

sed 's/-i (.*)\./XXX/' <src.txt 

EXPECTED:

ffmpeg XXX3gp 
ffmpeg XXX3gp 
ffmpeg XXX3gp 

實際結果:

ffmpeg -i uno.3gp 
ffmpeg -i dos.3gp 
ffmpeg -i tres.3gp 

COMMAND:

sed 's/-i (.*)\.3gp/\1.mp3/' <src.txt 

預期:

ffmpeg uno.mp3 
ffmpeg dos.mp3 
ffmpeg tres.mp3 

實際效果

sed: -e expression #1, char 18: invalid reference \1 on `s' command's RHS 

括號似乎並沒有進行分組工作的,但是我發現周圍的教程和例子似乎認爲他們應該...

回答

5

在經典sed(不GNU sed一定),分組命令使用\(\)(和計數使用\{\}),而不是轉義。

因此,你應該嘗試:

sed 's/-i \(.*\)\./XXX/' <src.txt 
sed 's/-i \(.*\)\.3gp/\1.mp3/' <src.txt 

或者,如果你有GNU sed,添加-r--regexp-extended爲 '在腳本中使用擴展正則表達式'(來自sed --help引用)。

sed -r 's/-i (.*)\./XXX/' <src.txt 
sed -r 's/-i (.*)\.3gp/\1.mp3/' <src.txt 
+0

太好了。我以爲我曾經嘗試過斜槓,但是那時候我並沒有使用頂點「,所以我必須用更多的斜槓來逃避所有事情,而且我沒有把握好。謝謝 – matteo 2012-08-11 10:04:56

2

喬納森萊弗勒回答你的錯誤的根源,我想提一提,那反向引用不一定是好東西,有時候真的會減慢腳本。

此外,在你情況下,你並不需要反向引用都:

sed 's/-i //;s/\.3gp/.mp3/' <src.txt 

將做的工作。

+0

謝謝,但我的只是一個愚蠢的最小化的例子來說明問題;) – matteo 2012-08-11 09:59:06