LINUX.ORG.RU

[sed] Как ввести символ ";" (точка с запятой)?

 


0

0

Здравствуйте!


Простой пример. Дана команда:

echo 'style="font-size:4px;font-style:normal"' | sed 's/font-size:.\*\?//g'

Ее вывод:

style="px;font-style:normal"

А нужно, чтобы выводило:

style="font-style:normal"

То есть, после жадного квантора ".\*\?" надо вписать точку с запятой ";". И с этим у меня проблемы. Пробовал варианты:

sed 's/font-size:.\*\?;//g'
sed 's/font-size:.\*\?\;//g'
sed 's/font-size:.\*\?\\;//g'
sed 's/font-size:.\*\?\\\;//g'

но толку никакого. Толи bash принимает ";" за конец команды, толи sed-у надо как-то хитро указывать символ ";".


Вопрос: как сделать так, чтоб точка с запятой стала частью регулярного выражения в sed?


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

> echo 'style=«font-size:4px;font-style:normal»' | sed 's/font-size:.*;//g'

УМВР.


Такой регвыр и у меня работает.

Только почему-то ты квантор вместо жадного ленивым сделал. Нафига?


Твой регвыр неправильно сработает на строке

style=«font-size:4px;font-style:normal;»

- удалит всю строку, вместе с font-style.


Поэтому вопрос остается открытым.

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

Подумай, что будет удаляться, если строка будет такой:

style=«font-size:4px; font-style:normal; font-чегототам; font-ещечегототам»

Вместо строки «font-size:4px;» будет удалено больше, чем нужно.

xintrea
() автор топика
Ответ на: комментарий от anon_666
> echo 'style="font-size:4px;font-style:normal;"' | sed -e 's/font-size:[^;]*;//g'

Слушайте, да что же вы сплошные костыли придумываете?

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

Твой регвыр криво работает, если изменить последовательность стилей. Вместо font-size;font-style пишем font-style;font-size, и упс:

Образец:

style="font-style:normal;font-size:4px;"

Результат:

font-style:normal;style=""

А последовательность стилей может быть любой.

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

Так, походу нащупал.

Видимо, sed вообще не знает, что ".*?" - это жадный квантор. И символ вопроса интерпретирует как обычный символ.

Это что за буллщит такой?

xintrea
() автор топика
Ответ на: комментарий от xintrea
┌[~]
└> echo 'style="font-size:4px;font-style:normal;"' | sed 's/font-size:[0-9]*px;\?//g'
style="font-style:normal;"

Должно работать при любом порядке, в т.ч. когда после размера не будет `;'.

GotF ★★★★★
()

Кароче, специалистов на лоре нет, как всегда приходится всё делать самому.

Sed действительно не знает жадные кванторы. А еще он не знает метасимволы, вместо них наборы символов в [] надо писать.

Чтобы работать по-человечески с регвырами, надо ставить supersed (ssed), и запускать его с опцией --regexp-perl. В нем и жадные кванторы работают, и метасимволы \d, \w, и все что положено.

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

> Чтобы работать по-человечески с регвырами, надо ставить supersed (ssed), и запускать его с опцией --regexp-perl.

Не проще ли запускать прямо перл? Всякие крутые регвыры в разных седах и грепах работают по-разному, поэтому либо юзать простые, либо перл.

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

> Не проще ли запускать прямо перл?

Вам прощще выучить перл, чем запустить «ssed --regexp-perl»? Мисье тонкий извращенец.

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

> Sed действительно не знает жадные кванторы.

AFAIK, в sede ВСЕ кванторы жадные. Он не знает нежадных, они есть только в перле

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

>Вам прощще выучить перл, чем запустить «ssed --regexp-perl»?

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

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

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

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

> > Не проще ли запускать прямо перл?

Вам прощще выучить перл, чем запустить «ssed --regexp-perl»? Мисье тонкий извращенец.


Проще поставить какую-то левую программу, чем запустить переносимое и простое решение perl -pe 's,font-size:.*?;,,g'? Мисье толстый извращенец.
А вообще есть опция sed -r, включающая extended regexp (в GNU sed):
sed -r 's,font-size:.*?;,,g'
Для фряшного это sed -E.

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

>Твой регвыр криво работает, если изменить последовательность стилей.
Нет.

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