LINUX.ORG.RU

sed: просмотр вперед/назад, отрицание просмотра вперед/назад

 ,


0

2

Доброго дня! Пытаюсь удалить пробелы из html-файла, стоящие перед окончанием тега </ :

</div>   </div>
Решил воспользоваться регулярными выражениями:
sed -i 's/\x20+\(?=\x3C\x2F\)//' text.html
sed -i 's/\x20+(\x3C\x2F\)?=//' text.html
но ни одно не работает - пробелы не исчезают

Как в sed организовать остальные операции просмотра, получается эти операции тоже работать не будут?:

/(foo)?#3bar/ - Просмотр назад
/(foo)?~3bar/ - Отрицание просмотра назад
/\w+(\t)?=/ - Просмотр вперед
/foo(bar)?!/ - Отрицание просмотра вперед
GNU sed version 4.0.7


Ответ на: комментарий от t184256

Поподробнее, ткните пальцем, пожалуйста, где это? По теме: Сорри: sed -i 's/\x20+(\x3C\x2F\)?=//' text.html Правильно так:

sed -i 's/\x20+\(\x3C\x2F\)?=//' text.html
но так, или иначе, не работает

xseed
() автор топика

Как-нибудь так:

sed 's/\ *\<\//\\<\//g'
"(Любое количество пробелов)(хвост тега)" заменить на "(хвост тега)"

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

Хорошо, даже если это не HTML, мне просто интересно, как в sed делается просмотр вперед/назад.

xseed
() автор топика
Ответ на: комментарий от t184256

Нихрена не понял, на за ссылку спасибо. Вы, наверное, хотите мне намекнуть на какой-нибудь HTML-Tree или Tidy HTML, но мне это и не нужно, я просто пытаюсь почистить текст в общем случае и все. Поэтому хочу узнать, поддерживается ли в регэкспах sed просмотр назад вперед и отрицание просмотра?

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

Нет, на ЯП общего назначения и парсер X(HT)ML. А в регекспах я недостаточно шарю, чтобы ответить на твой вопрос, извини.

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

Спасибо, но мне нужно узнать, как работает просмотр в sed.

http://www.gnu.org/software/sed/manual/sed.html#Regular-Expressions http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html#tag_20_116... http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_0...

Вкратце: в POSIX-овых регулярках нет такой фичи.

unterwulf
()

(?=...)

Смотри про отличия между basic regex, externded regex и perl regex

/foo(bar)?!/ - Отрицание просмотра вперед

Откуда ты это взял? Это даже не perl regex.

В любом случае sed не умеет просмотр вперёд/назад

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

Откуда ты это взял?

nnCron

Смотри про отличия между basic regex, externded regex и perl regex

Спасибо, вот еще бы хорошую ссылочку для чтения.

xseed
() автор топика

Как в sed организовать остальные операции просмотра

Вроде можно собрать sed с поддержкой перловых регулярных выражений. Но проще использовать perl, в частности psed.

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

Почему моветон, объясните неграмотному?

это городская легенда лоровских кукаретиков

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

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

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

nnCron

У него совсем свои регекспы. Не имеющие отношения к трём предыдущим вариантам.

Почему моветон, объясните неграмотному?

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

<b>hello
world</b>

<b>hello world</b>

<b>hello                                      world</b>

А с точки зрения регекспов это три совершенно разные наборы строк.

kim-roader ★★
()
Ответ на: комментарий от anonymous

Во-первых «Регулярные выражения» sed не имеют никакого отношения к «регулярным выражениям» Хомского. Доказательство: sed может матчить языки с контекстно-зависимой грамматикой. Пример:

echo 'foo foo foo' | sed -n '/^\(\w\+\) \1 \1$/p'

Во-вторых, задача из ОП-поста (удалить лишние пробелы перед закрывающими тегами) решаема при помощи простого конечного автомата, а значит использование регулярных выражений для её решения оправданно. А предложения преобразовывать HTML в дерево для решения этой задачи считаю оверинженерингом и глупой мантрой.

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