我故意在这里发布了这个问题,尽管 - 就我而言 - 它与laTex有关。问题本身是通用的。
我有几个*.tex
- 源文件,其中包含对图片的引用,例如: image1.jpg
和image2.png
。我想在所有源文件中搜索指定的一组扩展名(在本例中为 jpg 和 png ),并将其替换为pdf对应项。因此,我希望最终得到参考image1.pdf
和image2.pdf
。为了使问题复杂化,我有一个20个文件的列表(image3.jpg,图像4.png等)我不想改变。
是否有一个简单的解决方案(基于sed或任何工具建议?)可能会有所帮助?不过,我不是正规表达大师。 ;)
答案 0 :(得分:2)
更简单的方法是:
image3.jpg, image4.png
- >的 image3.JPG, image4.PNG
强> *.jpg, *.png
- >的 *.pdf
强> image3.JPG, image4.PNG
- >的 image3.jpg, image4.png
强> 答案 1 :(得分:1)
我建议使用find
获取文件列表,使用grep -v
对其进行过滤,以删除您不想更改的文件,然后使用xargs
运行这些文件sed -r -i 's/image([12])\.(jpg|png)/image\1.pdf/g'
。请注意,sed -i
执行替换,以便在出现问题时备份文件更好。您还可以使用sed -ibak
让sed
在修改文件之前使用bak
扩展名进行备份。
答案 2 :(得分:1)
将黑名单中的文件名替换为一些“魔术”字符串,这样它们就不会像文件名一样,也不会被任何东西匹配。
cat your.tex | \
sed 's/image3.jpg/MMMAAAGGGIIICCC1/g' | \
sed 's/image4.png/MMMAAAGGGIIICCC2/g' | \
# ... all others on your blacklist
# then do regexp replacements
sed 's/\(image[0-9]\+\)\.\(png\|jpg\)/\1.pdf/g' | \
# ... convert all "magics" back
sed 's/MMMAAAGGGIIICCC1/image3.jpg/g' | \
sed 's/MMMAAAGGGIIICCC2/image4.png/g' | \
# ... and many others
# then output
cat > output.tex