Intereting Posts

Чтобы заменить% меток, но не \% в Perl Regex

Я думаю, как вы можете заменить метки [^\]% но не \% метки в команде sed этого ответа . Я думаю, что смотреть не нужно.

Моя текущая команда Sed, но я думаю, что Perl должен здесь

 cat something | sed 's#%.*</#</#' 

который удаляет также все после знака % т.е. всех комментариев в LaTeX, но не процентных значений.

Моя неудачная попытка Perl

 cat something | perl 's#[^\]%.*</#</#' 

где я не знаю, как я делаю Perl для стандартного вывода cat.

Данные

 ------------------------------ Protocol of pre-eclampsia ------------------------------ Monitoring in 90\% cases Antihypertensives when % this is a comment, please, remove me! $SBP/DBP > 160/110$; slowly. ------------------------------ 

Желаемый выход

 ------------------------------ Protocol of pre-eclampsia ------------------------------ Monitoring in 90\% cases Antihypertensives when $SBP/DBP > 160/110$; slowly. ------------------------------ 

Как вы можете заменить знаки % но не \% ? Если вы можете это сделать, Сед, пожалуйста, прокомментируйте.

Как и многие, если не большинство, инструменты синтаксического анализа текста, perl может принимать входные данные из командной строки, нет необходимости в cat . Вам просто нужно -e которое позволяет передавать сценарий в качестве параметра командной строки и -n что означает «запустить скрипт на каждой строке ввода». С другой стороны, вы можете использовать ключ -p который означает «запустить скрипт на каждой строке ввода, а затем распечатать эту строку». Эти две команды эквивалентны (но второй – классическое бесполезное использование кошки, используйте первое):

 perl -pe 's/foo/bar/' file cat file | perl -pe 's/foo/bar/' 

Теперь, если я правильно понимаю, вы хотите удалить все комментарии LaTeX (хотя это не то, о чем говорит ваш вопрос). Если это так, lookbehind – самый простой способ:

 perl -pe 's/(?<!\\)%.*//' file 

Ваше регулярное выражение также должно работать, вам просто нужно сохранить символ, который вы сопоставили до % и избежать обратного слэша:

 perl -pe 's/(^|[^\\]+)%.*/$1/' file 

Вы можете сделать то же самое с GNU sed :

 sed -r 's/(^|[^\\])%.*/\1/' file 

Если вы просто хотите заменить то, что следует % но не то, что следует \% , в Perl, самый простой способ – с отрицательным lookbehind : match %.* Только если ему не предшествует обратная косая черта.

 perl -pe 's/(?<!\\)%.*//' 

Однако это не будет соответствовать чему-то вроде Hello world.\\%wibble . Для этого вам нужно проверить, что % предшествует четное число обратных косых черт. Вы не можете сделать это с помощью lookbehind, потому что Perb's lookbehind поддерживает только шаблоны фиксированной длины. Вместо этого сопоставьте обратную косую черту в регулярном выражении и используйте lookbehind, чтобы гарантировать, что regexp захватывает их все.

 perl -pe 's/(?<!\\)((?:\\\\)*)%.*/$1/' 

Вы можете сделать это с помощью инструментов, которые также не поддерживают lookbehind. В этом случае вам нужно либо использовать сложную последовательность команд замены, либо сопоставлять обратную косую черту и копировать их на заменяющий текст.

 sed -e 's/^\(\(\\\\\)*\)%.*/\1/' -e 's/\([^\\]\(\\\\\)*\)%.*/\1/' 

Обратите внимание: если вы обрабатываете документ LaTeX, есть другие процентные знаки, которые могут потребоваться, например, в дословных блоках. Это невозможно сделать только с регулярными выражениями.

Общепринятая идиома для замены неэкранированных символов в perl :

 $ printf '%s\n' '% \% \\% \\\%' | perl -pe 's/(\\.)|%/$1||"<replacement>"/ge' <replacement> \% \\<replacement> \\\% 

Итак, чтобы удалить все, начиная с неограниченного % :

 perl -pe 's/(\\.)|%.*/$1/g' 

Если ваш sed поддерживает -E (FreeBSD / GNU):

 sed -E 's/(\\.)|%.*/\1/g' 

Или с GNU sed :

 sed 's/\(\\.\)\|%.*/\1/g' 

Если альтернативный оператор RE недоступен (как в стандартном базовом RE), вы часто можете использовать \{0,1\} :

 sed 's/\(\(\(\\.\)\{0,1\}[^\\%]*\)*\)\(%.*\)\{0,1\}/\1/'