2012-01-21 3 views
12

私はLaTeXの中でコンパイルしたいプレーンテキスト文書を持っています。ただし、 "#"、 "$"、 "%"、 "&"、 "_"の文字が含まれることがあります。 LaTeXで正しくコンパイルするには、まずこれらの文字を "#"、 "\ $"、 "\%"、 "\ &"、 "_"に置き換えなければなりません。これは正しいです

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にこの行を使用していますか?

残念ながら、ファイルが大きすぎてGUIソフトウェアで開くことができないため、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のエスケープ文字であるため、あなたは脱出する必要がありますことに注意してくださいそれも元のファイルに保存されます。私はsedのために応答しない

+1

うまくやった! +1 –

+3

かっこは必要ありません。 'sed'のいくつかのバージョンは' -E'をサポートしませんが、代わりに '-r'を使います。 'sed'のいくつかのバージョンは' -i'の後ろに拡張子を必要としますが、OPはそれを提供していないので、それが必要でないと考えるのは安全です。 –

+2

良い点、すべて。私は、-Eはバージョンが使用中であることに依存するが、最終版から削除していなければならないことに言及しようとしていた。 – chepner

2

あなたの問題は、bash自体がそれらのエスケープを処理していると思います。

  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 

あなたはそれらのほとんどの最初の(検索)文字列に\を必要としない、ちょうど$(それはラインの終わりを意味する、特殊な文字だ、残りは特別ではありません) 。そして交換では、あなたは2つだけ\\、3つが必要です。これらは、単一引用符で囲まれているので、あなたはダブルエスケープする(\\除く)何もする必要はありません

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

:また、あなたはいくつかの-e文を一つにそれをすべて行うことができます。 grepでは、bashは特殊文字(具体的には変数の記号)であるため、$のエスケープを解釈しています。したがって、grepは、行末を意味する特殊文字である$を取得して検索しています。あなたは、単一引用符、それは解釈からbashを防ぐためにする必要があり\'\$'、または\\の別のペアを追加しますから `\ "\\\$". Presumably, that's where you're getting theを、それが書かれていて、あなたがsedでそれを必要としないことができます

+0

"$"は特別なので、3つの '\'(例えば '\\\')が必要ですか? – Village

+1

@Village交換には含まれていません。 – Kevin

2

は、他の回答は

あなたは、巨大なファイルをチェックするビューアとしてlessを使用することができます;-)良いenougthある(またはmoreが、lessmoreよりも快適です)。検索するための

、あなたはfgrepを使用することができます:それは正規表現=>fgrep '\$'が本当にテキスト\$を検索します無視します。 fgrepは、grep -Fを呼び出すのと同じです。

編集: fgrep '\$'fgrep "\$"は異なります。 2番目のケースでは、bashは文字列を解釈し、1文字で置き換えます(fgrep$のみを検索します)。

関連する問題