Замените «продвинутый» шаблон в sed - PullRequest
0 голосов
/ 09 июня 2019

Я не могу понять, как изменить это:

\usepackage{scrpage2}
\usepackage{pgf} \usepackage[latin1]{inputenc}\usepackage{times}\usepackage[T1]{fontenc}
\usepackage[colorlinks,citecolor=black,filecolor=black,linkcolor=black,urlcolor=black]{hyperref}

на это с использованием только sed

REPLACED
REPLACED REPLACEDREPLACEDREPLACED
REPLACED

Я пытаюсь что-то вроде sed 's!\\.*\([.*]\)\?{.\+}!REPLACED!g' FILE

, но этодает мне

REPLACED
REPLACED
REPLACED

Я думаю. * привыкает, а все остальное в моем шаблоне просто игнорируется, но я не могу понять, как это сделать.

После того, как я узнал, как отформатировать такое регулярное выражение, моим следующим шагом было бы изменить его на следующее:

\usepackage{scrpage2}
\usepackage{pgf} 
\usepackage[latin1]{inputenc}
\usepackage{times}
\usepackage[T1]{fontenc}
\usepackage[colorlinks,citecolor=black,filecolor=black,linkcolor=black,urlcolor=black]{hyperref}

Так что я был бы признателен за любые указатели в этом направлении.

Ответы [ 2 ]

2 голосов
/ 09 июня 2019

Вот код, который работает для примера, который вы дали:

sed 's/\\[^\\[:space:]]\+/REPLACED/g'

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

Чтобы сделать вещи более конкретными, вы можете использовать

sed 's/\\[[:alnum:]]\+\(\[[^][]*\]\)\?{[^{}]*}/REPLACED/g'

т.е. соответствует обратной косой черте, за которой следует один или несколько буквенно-цифровых символов, за которыми следует необязательная группа [ ], за которой следует группа { }.

Группа [ ] соответствует [, за которым следуют ноль или более символов без скобок, а затем ].

Группа { } совпадает с {, за которым следует ноль или более символов без скобок, после которых следует }.

1 голос
/ 09 июня 2019

Perl на помощь!Он имеет «экономные квантификаторы»:

perl -pe 's!\\.*?\.?{.+?}!REPLACED!g' FILE

Обратите внимание, что я удалил группу захвата, так как вы ее нигде не использовали.Кроме того, [.*] соответствует либо точке, либо звездочке, но вы, скорее всего, захотите сопоставить ее с буквальной точкой.

...