2015-05-25 147 views
4

我有看起來像如何使用sed替換正則表達式捕獲組?

lolsed_bulsh.png 

許多分散的文件路徑大文件我想和喜歡的擴展路徑預先考慮這些文件的名稱:

/full/path/lolsed_bullsh.png 

我有一個很難匹配並捕獲這些。目前,我想要的變化:

cat myfile.txt| sed s/\(.+\)\.png/\/full\/path\/\1/g | ack /full/path 

我認爲SED具有一定的正則表達式或捕獲組的行爲,我不理解

+0

BRE不支持一個或多個'+'。使用'.. *'代替(如果您需要確保至少有1個字符)。 – nhahtdh

回答

5

sed使用POSIX BRE和BRE doesn't support one or more quantifier +。量詞+僅爲supported in POSIX ERE。但是,POSIX sed uses BRE and has no option to switch to ERE

如果要保持可移植性,請使用..*來模擬.+

或者,如果您可以假定代碼始終在GNU sed上運行,則可以使用GNU擴展.\+。或者,您也可以使用GNU擴展-r標誌切換到POSIX ERE。 higuaro's answer中的-E標誌是an undocumented flag for compatibility with BSD sed,具有相同的效果。

+0

在GNU sed中,'-r'調用'ERE'功能,但請參閱[這裏](http://stackoverflow.com/questions/3139126/whats-the-difference-between-sed-e-and-sed-e )瞭解更多詳情。 – potong

+0

@potong:謝謝。我會更正這些信息。 – nhahtdh

8

在您的正則表達式的變化+*

sed -E "s/(.*)\.png/\/full\/path\/\1/g" <<< "lolsed_bulsh.png" 

它打印:

/full/path/lolsed_bulsh 

注:非標準-E選擇是避免逃逸()

+1

我錯過的細節是第一個捕獲組位於'\ 1',而不是'\ 0',它似乎是整個當前行。 – ThorSummoner

1

保存自己一些通過選擇不同的分隔符(和-E選項),例如逃避:

cat myfile.txt | sed -E "s|(..*)\.png|/full/path/\1|g" | ack /full/path 
相關問題