我有看起來像如何使用sed替換正則表達式捕獲組?
lolsed_bulsh.png
許多分散的文件路徑大文件我想和喜歡的擴展路徑預先考慮這些文件的名稱:
/full/path/lolsed_bullsh.png
我有一個很難匹配並捕獲這些。目前,我想要的變化:
cat myfile.txt| sed s/\(.+\)\.png/\/full\/path\/\1/g | ack /full/path
我認爲SED具有一定的正則表達式或捕獲組的行爲,我不理解
我有看起來像如何使用sed替換正則表達式捕獲組?
lolsed_bulsh.png
許多分散的文件路徑大文件我想和喜歡的擴展路徑預先考慮這些文件的名稱:
/full/path/lolsed_bullsh.png
我有一個很難匹配並捕獲這些。目前,我想要的變化:
cat myfile.txt| sed s/\(.+\)\.png/\/full\/path\/\1/g | ack /full/path
我認爲SED具有一定的正則表達式或捕獲組的行爲,我不理解
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,具有相同的效果。
在您的正則表達式的變化+
與*
:
sed -E "s/(.*)\.png/\/full\/path\/\1/g" <<< "lolsed_bulsh.png"
它打印:
/full/path/lolsed_bulsh
注:的非標準-E
選擇是避免逃逸(
和)
我錯過的細節是第一個捕獲組位於'\ 1',而不是'\ 0',它似乎是整個當前行。 – ThorSummoner
保存自己一些通過選擇不同的分隔符(和-E選項),例如逃避:
cat myfile.txt | sed -E "s|(..*)\.png|/full/path/\1|g" | ack /full/path
BRE不支持一個或多個'+'。使用'.. *'代替(如果您需要確保至少有1個字符)。 – nhahtdh