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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Регексп для sed - выборочное удаление двойных пробелов  (Прочитано 1682 раз)

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

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
Есть html со ссылками. Одна строка.

Нужно удалить повторяющиеся пробелы в тексте, но не тронуть участки внутри href="..."

Пример:
Текст с двойными  тройными   и т.д. пробелами <a href="http://url/имя файла где должны остаться  сдвоенные пробелы.zip">текст ссылки</a> Еще какой-то текст. <a href="http://url/имя второго файла где должны остаться  повторяющиеся    пробелы.pdf">Еще одна ссылка с неприкасаемыми пробелами</a> и опять просто текст...

Можно ли написать такой регексп для sed?

Upd. Или лучше сделать как-то более по-другому?
« Последнее редактирование: 26 Января 2015, 21:29:32 от 027 »
Если бы было достаточно man bash, не было бы ABS.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Давайте уточним, неизменяемые участки начинаются с <a href= и заканчиваются </a> ? Во всех остальных частях сдвоенные пробелы меняются?
Код: (bash) [Выделить]
sed ': 1 ; s%  \+\([^<>]*\(<a href=.\+</a>\|$\)\)% \1% ; t 1'
« Последнее редактирование: 27 Января 2015, 02:22:18 от Azure »
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
Нет, хотелось бы сделать
href="неизменяемый участок"
Если бы было достаточно man bash, не было бы ABS.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
027,
И Вы считаете что того что Вы написали достаточно, чтобы понять что Вы хотите? Как быть с Вашим примером
Цитировать
Еще одна ссылка с неприкасаемыми пробелами
Где тут href=? Что неправильно делает скрипт, приведенный выше? Примеры?
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
027,
И Вы считаете что того что Вы написали достаточно, чтобы понять что Вы хотите? Как быть с Вашим примером
Цитировать
Еще одна ссылка с неприкасаемыми пробелами
Где тут href=?
Попробую изложить иначе: повторяющиеся пробелы должны заменяться одним пробелом везде, кроме атрибута href.
В примере следует понимать так:
Цитировать
Еще одна ссылка с неприкасаемыми пробелами [в URL]
То есть, текст ссылки должен обрабатываться, адрес ссылки - не должен.
Если бы было достаточно man bash, не было бы ABS.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Что неправильно делает скрипт, приведенный выше? Примеры?
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
Один момент упущен:
Есть html со ссылками.

Стало быть простой отрицающий класс [^<>] не годится, так ведь?

Вот уточненный тестовый пример, где скрипт спотыкается об угловые скобки:
Текст с двойными  <font color="blue">тройными</font>   и т.д.        <font color="red">пробелами</font>               <a href="http://url/имя файла где должны остаться  сдвоенные пробелы.zip">текст ссылки</a> Еще какой-то текст. <a href="http://url/имя второго файла где должны остаться  повторяющиеся    пробелы.pdf">Еще одна ссылка          с   неприкасаемыми пробелами</a> и опять просто текст...

Вывод скрипта:
Текст с двойными  <font color="blue">тройными</font>   и т.д.        <font color="red">пробелами</font> <a href="http://url/имя файла где должны остаться  сдвоенные пробелы.zip">текст ссылки</a> Еще какой-то текст. <a href="http://url/имя второго файла где должны остаться  повторяющиеся    пробелы.pdf">Еще одна ссылка          с   неприкасаемыми пробелами</a> и опять просто текст...
Пользователь решил продолжить мысль [time]27 Январь 2015, 21:21:59[/time]:
Один момент упущен:
Есть html со ссылками.

Стало быть простой отрицающий класс [^<>] не годится, так ведь?

Вот уточненный тестовый пример, где скрипт спотыкается об угловые скобки:
Текст с двойными  <font color="blue">тройными</font>   и т.д.        <font color="red">пробелами</font>               <a href="http://url/имя файла где должны остаться  сдвоенные пробелы.zip">текст ссылки</a> Еще какой-то текст. <a href="http://url/имя второго файла где должны остаться  повторяющиеся    пробелы.pdf">Еще одна ссылка          с   неприкасаемыми пробелами</a> и опять просто текст...

Вывод скрипта:
Текст с двойными  <font color="blue">тройными</font>   и т.д.        <font color="red">пробелами</font> <a href="http://url/имя файла где должны остаться  сдвоенные пробелы.zip">текст ссылки</a> Еще какой-то текст. <a href="http://url/имя второго файла где должны остаться  повторяющиеся    пробелы.pdf">Еще одна ссылка          с   неприкасаемыми пробелами</a> и опять просто текст...
Пользователь решил продолжить мысль 27 Января 2015, 21:24:44:
А можно пояснить по выражению для sed? Я в его синтаксисе пока что слабо ориентируюсь. Правильно ли я понял, Вы вместо традиционного прямого слеша применяете символ % в качестве делимитера?
« Последнее редактирование: 27 Января 2015, 21:24:44 от 027 »
Если бы было достаточно man bash, не было бы ABS.

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4062
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
027, пример это так: вход и выход.
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
Вход и выход приведен выше. Или необходимо явно писать слова вход-выход?
Если бы было достаточно man bash, не было бы ABS.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Ещё раз формулируем условие заменить сдвоенные (строенные и т.д) пробелы везде кроме тех, что внутри href="..." (кавычки обязательны!). Поскольку в строке ссылок может быть несколько для борьбы с "жадной" квантификацией придется вставить какой-нибудь явно неиспользуемый символ (тут «^») и затем убрать его:
Код: (bash) [Выделить]
sed -r 's/href="[^"]+"/&^/g ; : 1 ; s/  +([^^]*(href|$))/ \1/ ; t 1 ; s/\^//g'* параметр -r  добавлен чтоб убрать экранирование скобок и «+»
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн 027

  • Автор темы
  • Участник
  • *
  • Сообщений: 122
  • Cinnamon
    • Просмотр профиля
Огромное спасибо, эта версия работает.

внутри href="..." (кавычки обязательны!)[/i]
Это само собой, ибо url с пробелами.
для борьбы с "жадной" квантификацией придется вставить какой-нибудь явно неиспользуемый символ (тут «^») и затем убрать его
Ага, вон как, Вы ставите уникальный маркер.
* параметр -r  добавлен чтоб убрать экранирование скобок и «+»
Можно сказать и так. :)

Еще раз спасибо! Вы помогли мне автоматизировать еще один кусочек повседневной рутины.
Если бы было достаточно man bash, не было бы ABS.

 

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