2012-03-15 56 views
2

我特意在此發佈了此問題,雖然 - 對於我的情況 - 它與laTex相關。問題本身雖然是通用的。在Linux下替換文件中的自定義字符串

我有幾個*.tex - 包含圖像引用的源文件,例如image1.jpgimage2.png。我想搜索指定的一組擴展名的所有源文件(在本例中爲jpgpng),並將它們替換爲它們的pdf對應文件。因此,我想結束參考image1.pdfimage2.pdf。爲了使問題複雜化,我列出了20個文件(image3.jpg,image 4.png等),我不想改變。

那裏有一個簡單的解決方案(基於sed或任何工具建議?),這可能有幫助嗎?雖然我不是正則表達式大師。 ;)

+0

所以你想替換'* .tex'文件中的* references * – 2012-03-15 14:28:39

回答

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 
1

我建議使用find獲取文件列表,grep -v將其過濾,以除去不希望發生變化的文件,然後使用xargs對這些文件sed -r -i 's/image([12])\.(jpg|png)/image\1.pdf/g'運行。請注意,sed -i會執行替換操作,所以最好備份您的文件以免出現問題。您還可以使用sed -ibaksed在修改文件之前使用bak擴展進行備份。

2

一個更簡單的方法是:

  • image3.jpg, image4.png - >image3.JPG, image4.PNG
  • *.jpg, *.png - >*.pdf
  • image3.JPG, image4.PNG - >image3.jpg, image4.png