LINUX.ORG.RU
ФорумAdmin

Регэксп

 , ,


0

2

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

Нужно для поиска и замены придумать выражение, которое будет означать всё что находится между: [CDATA[ и <!--more-->

Помогите, плиз, это единственный способ убрать дубликаты excerpt'ов после переноса сайта с DLE на WP...

Почему ещё никто не вбросил пасту про XML и регэкспы?

generator ★★★ ()
Ответ на: комментарий от emostar

Флаг /m нужен, чтобы оно многострочные выражения обрабатывало. В разных языках он по разному передается, например в питоне вот так:

re.findall('\[CDATA\[(.*?)<!--more-->',a, re.DOTALL)

А вот как с этим в sed - я не знаю.

pawnhearts ★★★★★ ()
Ответ на: комментарий от MrClon
sed -E 's/\[CDATA\[(.*)<!--more-->/\1/' wordpress.2015-11-26\ \(1\).xml > 001.xml

а что за единица в конце? нужно поменять так, чтобы удалить всё после [CDATA\[

включая more

emostar ()
Ответ на: комментарий от emostar

Для читаемости разобью sed-скрипт на строки:

s #найти и заменить
\[CDATA\[(.*)<!--more-->/ #регулярка которую нужно искать
\1 #чем заменить


\1 означает что заменить нужно первой группой из найденного регуляркой.
Группа в регулярке задается скобками (в данном случае это .* (любое колличество любых символов) между [CDATA[ и <!--more-->).
Думаю догадаешься как нужно переписать регулярку что-бы в первую группу вошло и <!--more-->.

P.S. если все посты в одном файле то эта конструкция скорее всего сработает неправильно. Да и вообще на реальных данных (разнообразных и непредсказуемых) она скорее всего сработает неправильно. Выше generator уже написал про парсеры XML, и правильно сделал что написал.

MrClon ★★★★★ ()
Ответ на: комментарий от MrClon

Не правильно сработает в случае >1 вхождения <!--more-->, sed жадный

anc ★★★★★ ()
Ответ на: комментарий от emostar

Раз уж на то пошло, костыль на перле:

cat log-file-name | perl -e 'while(<>){s/(\[CDATA\[).*?<!--more-->/\1/g;print};'

anc ★★★★★ ()
Ответ на: комментарий от MrClon

всё сработало как надо, по крайней мере визуально)

sed -E 's/\[CDATA\[(.*)<!--more-->/\[CDATA\[/' wordpress.2015-11-26.xml > final03.xml

emostar ()

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

blexey ★★★★★ ()
Ответ на: комментарий от blexey

никогда не переведутся любители парсить XML регекспами

Как и любители ограничивать себя в инструментарии

zolden ★★★★★ ()
Ответ на: комментарий от blexey

А где в словах «[CDATA[» находится xml? Даже если распарсить файл, то в строках нужен будет все тот же регэксп (если не принимать во внимание то, что комменты more могут вообще не попасть в результат).

arturpub ★★ ()
Ответ на: комментарий от zolden

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

blexey ★★★★★ ()

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

почитай Фридла и все станет понятно

kiotoze ★★★★ ()

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

Странно, обычно хватает странички в википедии.

ritsufag ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.