sed заменит "_", "&", "$" на "\ _", "\ &", "\ $" соответственно - PullRequest
7 голосов
/ 10 ноября 2011

При написании латекса обычно есть библиографический файл, который иногда содержит _, & или $. Например, название журнала «Структурная и молекулярная биология природы», название статьи «Оценка стоимости разработки новых лекарств: действительно ли это 802 млн. Долларов?» И номер тома «suppl_2».

Поэтому мне нужно преобразовать эти символы в \_, \& и \$ соответственно, то есть добавить обратную косую черту впереди, чтобы латексный компилятор мог правильно их идентифицировать. Я хочу использовать sed, чтобы сделать преобразование. Итак, я попытался

sed 's/_/\_/' <bib.txt >new.txt

но сгенерированный new.txt точно такой же, как bib.txt. Я подумал, что _ и \ нужно убежать, поэтому я попытался

sed 's/\_/\\\_/' <bib.txt >new.txt

но надежды тоже нет. Может кто-нибудь помочь? Спасибо.

Ответы [ 4 ]

12 голосов
/ 10 ноября 2011

Вы столкнулись с некоторыми трудностями из-за того, как оболочка обрабатывает строки.Обратная косая черта должна быть удвоена:

sed 's/_/\\_/g'

Обратите внимание, что я также добавил 'g', чтобы указать, что замена должна применяться глобально к строкам, а не только к первому совпадению.

Для обработки всех трех символов используйте класс символов:

sed 's/[_&$]/\\&/g'

(Амперсанд в тексте замены - это специальный символ, относящийся к сопоставленному тексту, а не буквальный символ амперсанда.)

3 голосов
/ 10 ноября 2011
sed 's/\([_&$]\)/\\\1/g'

например

eu-we1:~/tmp# cat zzz
bla__h&thisis&not the $$end
eu-we1:~/tmp# sed 's/\([_&$]\)/\\\1/g' < zzz
bla\_\_h\&thisis\&not the \$\$end
eu-we1:~/tmp# 
1 голос
/ 10 ноября 2011

Вам нужно дважды убежать.

➜  8080667  sed 's/_/\\_/' new.txt
In writing latex, usually there is a bibliography file, which sometimes contains \_, &, or $. For example, the journal name "Nature Structural & Molecular Biology", the article title "Estimating The Cost Of New Drug Development: Is It Really $802 Million?", and the volume number "suppl_2".
➜  8080667  
1 голос
/ 10 ноября 2011

Вам нужно сбежать от вашего \.Как это: sed 's/_/\\_/' new.txt.

Редактировать: Кроме того, чтобы изменить new.txt на месте, вам нужно передать sed флаг -i:

sed -iBAK 's/_/\\_/' new.txt

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...