Замена "#", "$", "%", "&" и "_" на "\ #", "\ $", "\%", "\ &" и "\ _" - PullRequest
12 голосов
/ 21 января 2012

У меня есть простой текстовый документ, который я хочу скомпилировать в 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 для успешной проверки строк с заменами?

Ответы [ 4 ]

21 голосов
/ 21 января 2012

Вы можете выполнить замену одним вызовом sed:

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

. * * * * * * * * * * * * * * * * * * *1003* в тексте замены заполняется в зависимости от того, какой отдельный символ заключен в скобки.Обратите внимание, что, поскольку \ является escape-символом LaTeX, вам также придется экранировать его в исходном файле.

4 голосов
/ 21 января 2012
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 интерпретирует escape на $, потому что это специальный символ (в частности, сигил для переменных), поэтому grep получает и ищет только $, который являетсяспециальный символ, означающий конец строки.Вам нужно либо заключить его в одинарную кавычку, чтобы bash не интерпретировал \ ('\$'), либо добавить еще одну пару \\: "\\\$". Presumably, that's where you're getting the \ `from, но вам не нужно это в sed как написано.

2 голосов
/ 21 января 2012

Я не отвечаю за sed, остальные ответы достаточно хороши; -)

Вы можете использовать less в качестве средства просмотра, чтобы проверить ваш огромный файл (или more, но lessудобнее, чем more).

Для поиска вы можете использовать fgrep: он игнорирует регулярное выражение => fgrep '\$' действительно будет искать текст \$.fgrep совпадает с вызовом grep -F.

РЕДАКТИРОВАТЬ: fgrep '\$' и fgrep "\$" отличаются.Во втором случае bash интерпретирует строку и заменит ее одним символом: $ (то есть fgrep будет искать только $).

2 голосов
/ 21 января 2012

Я думаю, ваша проблема в том, что bash сам обрабатывает эти побеги.

  1. То, что у вас есть, выглядит мне правильным.Но предупреждение: оно также будет вдвойне ускользать, например, \#, которое уже сбежало.Если это не то, что вы хотите, вы можете изменить свои шаблоны, чтобы проверить, что предшествующего \ уже нет.
  2. $ используется для синтаксиса подстановки команд bash.Я думаю, grep "\\$" file.txt должен делать то, что вы ожидаете.
...