2012-01-21 114 views
12

我有一個純文本文檔,我想在LaTeX中編譯。但是,它有時包含字符「#」,「$」,「%」,「&」和「_」。要在LaTeX的正確編譯,我必須先用 「#」, 「\ $」, 「\%」, 「\ &」 將這些字符替換,而 「_」。我已經使用這個行sed

sed -i 's/\#/\\\#/g' ./file.txt 
sed -i 's/\$/\\\$/g' ./file.txt 
sed -i 's/\%/\\\%/g' ./file.txt 
sed -i 's/\&/\\\&/g' ./file.txt 
sed -i 's/\_/\\\_/g' ./file.txt 

這是正確的嗎?

不幸的是,文件太大無法打開任何圖形用戶界面軟件,因此檢查,如果我的sed行是正確使用文本編輯器是困難的。我試着用grep搜索,但如預期的那樣搜索無法正常工作(如下面,我搜索含有「$」的行):

grep "\$" file.txt 
  • 什麼是把「\」在前面的最好辦法這些人物?
  • 我如何使用grep成功檢查與更換的線路?
+1

你能保證你沒有任何已經逃脫的特殊字符嗎? – wim

+1

如果不符合預期,grep是如何工作的? – chepner

+0

當我運行'grep「\ $」file.txt'時,它似乎將所有內容或幾乎所有東西都打印出來。我不知道爲什麼它會打印出如此多的文字,因爲「$」非常罕見。 – Village

回答

21

可以。做一個調用替換到sed

sed -i -E 's/([#$%&_\])/\\&/g' file.txt 

在替換文本&填補了哪個單個字符用括號括注意,因爲\是LaTeX的轉義字符,你必須逃脫它也在原始文件中。

+1

做得很好! +1 –

+3

括號不是必需的。某些版本的'sed'不支持'-E',而是使用'-r'。某些版本的'sed'需要'-i'後面的擴展名,但由於OP沒有提供這個問題,所以假設它不是必需的。 –

+2

好點,全部。我想提到的是,-E將取決於sed的使用版本,但必須從最終版本中刪除它。 – chepner

2

我覺得你的問題是,慶典本身就是處理那些逃逸。

  1. 你有什麼期待權給我。但警告:它也會雙倍逃脫,例如已經逃脫的\#。如果這不是你想要的,你可能想要修改你的模式來檢查沒有前面的\已經。
  2. $用於bash命令替換語法。我猜grep "\\$" file.txt應該做你期望的。
4
sed -i 's/\#/\\\#/g' ./file.txt 
sed -i 's/\$/\\\$/g' ./file.txt 
sed -i 's/\%/\\\%/g' ./file.txt 
sed -i 's/\&/\\\&/g' ./file.txt 
sed -i 's/\_/\\\_/g' ./file.txt 

你不需要對大多數人的第一(搜索)字符串\,只是$(這是一個特殊的字符,這意味着行的末尾,其餘都沒有特殊) 。而在替換中,你只需要兩個而不是三個。此外,您可以用幾個-e語句做這一切在一個:

sed -i.bak -e 's/#/\\#/g' \ 
      -e 's/\$/\\$/g' \ 
      -e 's/%/\\%/g' \ 
      -e 's/&/\\&/g' \ 
      -e 's/_/\\_/g' file.txt 

你並不需要雙擊任何逃生(除\\),因爲這些都是單引號。在您的grep中,bash正在解釋$上的轉義,因爲它是一個特殊字符(特別是變量的印記),所以grep正在獲取並搜索$,這是一個特殊字符,意思是一行的結尾。你需要或者單引號,以防止bash從解釋\'\$',或添加其他對\\"\\\$". Presumably, that's where you're getting the \`從,但因爲它是寫你不需要它在sed

+0

由於「$」是特殊的,它前面是否需要三個'\'(例如'\\\')? – Village

+1

@村莊未更換。 – Kevin

2

我不爲sed迴應,其他的答案是好的enougth ;-)

您可以使用less作爲觀衆來檢查您的大文件(或more,但lessmore更舒服)。

對於搜索,您可以使用fgrep:它忽略正則表達式=>fgrep '\$'將真正搜索文本\$fgrep與調用grep -F相同。

編輯: fgrep '\$'fgrep "\$"是不同的。在第二種情況下,bash解釋該字符串並將用單個字符替換它:$(即,fgrep將僅搜索$)。