在Linux下替换文件中的自定义字符串

时间:2012-03-15 14:09:13

标签: regex linux

我故意在这里发布了这个问题,尽管 - 就我而言 - 它与laTex有关。问题本身是通用的。

我有几个*.tex - 源文件,其中包含对图片的引用,例如: image1.jpgimage2.png。我想在所有源文件中搜索指定的一组扩展名(在本例中为 jpg png ),并将其替换为pdf对应项。因此,我希望最终得到参考image1.pdfimage2.pdf。为了使问题复杂化,我有一个20个文件的列表(image3.jpg,图像4.png等)我不想改变。

是否有一个简单的解决方案(基于sed或任何工具建议?)可能会有所帮助?不过,我不是正规表达大师。 ;)

3 个答案:

答案 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 -ibaksed在修改文件之前使用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