1

Как бы я использовал регулярное выражение (например, с sed), чтобы удалить все теги \index которые встречаются внутри любых тегов \index ?

Например, вложенный беспорядок как это:

\index{Test\index{test\index{test}}ing One\index{one} Two\index{two} Three\index{three}}

превратится в

\index{Testing One Two Three}

Спасибо

2 ответа2

2

Вы можете использовать цикл. Следующий код удалит \index{foo} если ему предшествует граница слова.

sed -r ':a;s/\b\\index\{[^{}]+}//;ta' inputfile

Для вашего данного образца, он будет производить:

\index{Testing One Two Three}

Однако следует помнить об использовании регулярных выражений для синтаксического анализа и манипулирования такими вложенными шаблонами. Если вы это сделаете, убедитесь, что вы наблюдаете diff ввода до и после изменения.


РЕДАКТИРОВАТЬ: Объяснение:

Сначала посмотрите на команду замещения:

s/\b\\index\{[^{}]+}//g
  • \b соответствует границе между символом слова \w и несловесным символом \W
  • \\index\{ соответствует \index{
  • [^{}]+} соответствует одному или нескольким объектам, которые не } а затем }

:a это метка. ta ответвляется a если замена прошла успешно.

Так что это будет работать, удалив самый внутренний index{} из строки, так что

\index{Test\index{test\index{test}}ing One\index{one} Two\index{two} Three\index{three}}

будет преобразован в:

\index{Test\index{test}ing One\index{one} Two\index{two} Three\index{three}}

и так до тех пор, пока не произойдет замена.

1

Следующие работы везде, где находится \index,

 sed -e 's/\\index{\([^]]*\)}/\\index{}/g' inputfile

кроме того, что ... это работает при условии, что открывающая и закрывающая скобки расположены на одной линии. У sed есть несколько опций (P, N, D) для работы с шаблонами, которые заканчиваются на нескольких строках, но они работают путем объединения двух последовательных строк. Поскольку возможно, что шаблон фигурных скобок {} закрывается в 3,4, .., n, ... строках, это потребует некоторого программирования.

В качестве альтернативы, если вас устраивает просто найти подходящие шаблоны (то есть не подставляя их), вы можете использовать:

pcregrep -M '\{(\s*.*\s*)*\}' test.txt

где опция -M используется для разрешения многострочных шаблонов. Это находит ноль или более вхождений (пробел, сопровождаемый. *, Сопровождаемый пробелом), при условии, что это все окружено фигурными скобками.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .