Форум русскоязычного сообщества Ubuntu


Автор Тема: Как заэкранировать минус в sed регулярке shell bash?  (Прочитано 1002 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Dexel

  • Автор темы
  • Активист
  • *
  • Сообщений: 295
    • Просмотр профиля
В упрощённом:
content=`echo -e "$content" | sed "1s|\([\\\-A-Za-z0-9а-яА-Я]\{,100\}\)|\1<--more-->|"`

Сия регулярка должна ставить метку <--more--> в контенте после заданного символа. В примере - после 100.
Либо раннее, если найден символ, не входящий в диапазон указанный в регулярке.

Гадёныш ставит метку перед минусом :(

Полное выражение:
content=`echo -e "$content" | sed "1s|\([\\\-A-Za-z0-9а-яА-Я ’”«–»‒°\:\.\,\\\(\\\)<\/>]\{,$maxlen_anons\}\)|\1<--more-->|"`
И так нет:
content=`echo -e "$content" | sed "1s|\([A-Za-z0-9а-яА-Я ’”«–»‒°\:\.\,\\\(\\\)\-<\/>]\{,$maxlen_anons\}\)|\1<--more-->|"`
И с тремя слешами нет:
content=`echo -e "$content" | sed "1s|\([A-Za-z0-9а-яА-Я ’”«–»‒°\:\.\,\\\(\\\)\\\-<\/>]\{,$maxlen_anons\}\)|\1<--more-->|"`


Все символы полного выражения понимает, кроме минуса. Вынес его перед диапазонами, и как не экранируй - ошибку пишет "криво указан диапазон".

Пример правильной обработки:
<strong>Освещение</strong>. Прямые солнечные лучи губительны для хризантемы. Ид
еальное место для нее – хорошо освещенный подоконник, который следует притенять в самые жаркие часы дня.<strong>Полив</strong>. Такие комнатные цветы как хризантемы очень любят обильный полив. Почва должна быть постоянно влажной, но не слишком сырой. Во время активного роста достаточно поливать два раза в неделю.<strong>Влажность воздуха</strong>. Периодически опрыскив<--more-->ай цветок из пульвер
...

А вот споткнулся перед минусом:
Выращивание аквариумных растений, несет в себе такую же ответственность, как и разведений рыб в аквариуме. Поэтому, выбирая растения для своего домашнего водоема, избегайте тропических видов из холодных резервуаров. Главными критериями выбора должен стать цвет водного растения <--more-->- он должен быть ярко зеленым...

На разных текстах проверялось, т.е. совпадение исключено.
« Последнее редактирование: 08 Июля 2014, 07:54:35 от Dexel »

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
А разве его нужно экранировать?
$ echo '---' | sed 's/[-]*/x/g'
x

Оффлайн Dexel

  • Автор темы
  • Активист
  • *
  • Сообщений: 295
    • Просмотр профиля
А разве его нужно экранировать?
$ echo '---' | sed 's/[-]*/x/g'
x
Точно работает без экранирования :D

content=`echo -e "$content" | sed "1s|\([A-Za-z0-9а-яА-Я -’”°\:\.\,\\\(\\\)\\\-<\/>]\{,$maxlen_anons\}\)|\1<--more-->|"`

Спасибо огромное :)
« Последнее редактирование: 08 Июля 2014, 09:43:53 от Dexel »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Такой набор [A-Za-z0-9а-яА-Я -’”°\:\.\,\\\(\\\)\\\-<\/>] вероятнее всего можно заменить классом, например [[:print:]]. Или есть символы которые надо исключить?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Dexel

  • Автор темы
  • Активист
  • *
  • Сообщений: 295
    • Просмотр профиля
Ага, sed классы с кирилицей оказывается понимает!

$ echo -e "\n\t-=abcЁёЫыЭэ=-" | sed "s/\([[:print:]]\+\)/_Beg_\1_End_/"

        _Beg_-=abcЁёЫыЭэ=-_End_
Спасибо!

 

Страница сгенерирована за 0.04 секунд. Запросов: 25.