Подтвердить что ты не робот

Заменяя "#", "$", "%", "&" и "_" на "\ #", "\ $", "\%", "\ &" и "\ _",

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

Ответ 1

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

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

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

Ответ 2

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 where you're getting the\`, вам нужно либо одинарную котировку, а вам не нужно в sed, как написано.

Ответ 3

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

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

Ответ 4

Я не отвечаю за sed, другие ответы хороши enougth; -)

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

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

EDIT: fgrep '\$' и fgrep "\$" различны. Во втором случае bash интерпретирует строку и заменяет ее на один символ: $ (т.е. fgrep будет искать только $).