我有一个大文件,有许多分散的文件路径,看起来像
lolsed_bulsh.png
Run Code Online (Sandbox Code Playgroud)
我想在扩展路径前添加这些文件名,如:
/full/path/lolsed_bullsh.png
Run Code Online (Sandbox Code Playgroud)
我很难匹配和捕捉这些.目前我正在尝试各种变化:
cat myfile.txt| sed s/\(.+\)\.png/\/full\/path\/\1/g | ack /full/path
Run Code Online (Sandbox Code Playgroud)
我认为sed有一些正则表达式或捕获组行为我不理解
hig*_*aro 23
在您正则表达式的变化+有*:
sed -E "s/(.*)\.png/\/full\/path\/\1/g" <<< "lolsed_bulsh.png"
Run Code Online (Sandbox Code Playgroud)
它打印:
/full/path/lolsed_bulsh
Run Code Online (Sandbox Code Playgroud)
注:该非标准 -E选择是避免逃逸(和)
Cez*_*usz 10
通过选择不同的分隔符(和-E选项)来避免一些转义,例如:
cat myfile.txt | sed -E "s|(..*)\.png|/full/path/\1|g" | ack /full/path
Run Code Online (Sandbox Code Playgroud)
sed使用POSIX BRE,而BRE不支持一个或多个量词+.量词+仅在POSIX ERE中受支持.但是,POSIX sed使用BRE并且无法切换到ERE.
使用..*模拟.+,如果你想保持便携性.
或者,如果您可以假设代码始终在GNU sed上运行,则可以使用GNU扩展.\+.或者,您也可以使用GNU扩展-r标志切换到POSIX ERE.该-E旗higuaro的答案是与BSD兼容的sed无证标志具有同等效力.