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


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: помогите с рег. выражением  (Прочитано 604 раз)

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

Оффлайн ALiEN175

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2200
  • X-9000SC
    • Просмотр профиля
помогите с рег. выражением
« : 20 Сентябрь 2016, 22:55:40 »
Задача: найти в тексте строку с нужным выражением, но не выводить только выражение, а всю строку, кроме самого выражения.

обычно делал так:
sed '/^nameserver /!d;s/nameserver //g' /etc/resolv.conf>>>ищем начало строки с nameserver, выводим полностью строку, но убираем само слово nameserver

Собственно, вопрос: так правильно, или можно как-то проще (лаконичнее) всё это сделать через регулярные выражения?

(Нажмите, чтобы показать/скрыть)

Благодарности на Yandex 41001488642430. Cпасибо.

Оффлайн Pilot6

  • Старожил
  • *
  • Сообщений: 11169
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #1 : 20 Сентябрь 2016, 23:47:31 »
Так пойдет?

awk '/^nameserver/ {$1=""; print $0}' /etc/resolv.conf
Только причем тут разработка и регулярные выражения?
Я в личке не консультирую. Вопросы задавайте на форуме.

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #2 : 21 Сентябрь 2016, 00:03:05 »
grep -Po '^nameserver\K.*'awk '/^nameserver/{sub(/^nameserver/,"");print}'
« Последнее редактирование: 21 Сентябрь 2016, 00:12:54 от renzrv »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #3 : 21 Сентябрь 2016, 00:53:14 »
Начали за здравие, а закончили awk
Код: Bash
  1. sed -n 's/nameserver //gp' /etc/resolv.conf
Код: Bash
  1. sed '/nameserver \?/! d;s///g' /etc/resolv.conf
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ALiEN175

  • Автор темы
  • Старожил
  • *
  • Сообщений: 2200
  • X-9000SC
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #4 : 21 Сентябрь 2016, 01:16:06 »
Azure, большое спасибо! Сколько примеров по sed видел - ни в одном такая простая конструкция (gp) не приводилась.
Благодарности на Yandex 41001488642430. Cпасибо.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #5 : 21 Сентябрь 2016, 01:31:03 »
ALiEN175, Я g продублировал, но зачем она Вам? Ведь nameserver ожидается только 1 в строке?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #6 : 21 Сентябрь 2016, 12:30:48 »
Azure, Еще вот интересно можно ли такое сделать sed'ом?
текст:
(Нажмите, чтобы показать/скрыть)
sed -n '/ *<FORECAST/,/ *<\/FORECAST>/p'Выводит от первой строки <FORECAST до последней <\/FORECAST>
А нужно например только первую группу, или вторую, номером вобщем выбрать группу.
На авке сделал:
Код: awk
  1. {$0~/^[ \t]*<FORECAST/&&s++};{if(s==1){print $0}}
С греп+сед тоже знаю, а вот на одном седе можно?
« Последнее редактирование: 21 Сентябрь 2016, 13:29:44 от renzrv »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #7 : 21 Сентябрь 2016, 15:15:47 »
Код: Text
  1. #!/bin/sed -f
  2.  
  3. /<FO/! d
  4. G
  5. h
  6. /\(<FO.*\)\{3\}/! d
  7. s/\n.*//
  8. :b
  9. /<\/FO/! {
  10.     N
  11.     bb
  12.     }
  13. q

Пользователь добавил сообщение 21 Сентябрь 2016, 15:35:45:
Код: awk
  1. /<FO/{
  2.     if(++s == 3)
  3.         p = 1
  4.     }
  5. p
  6. /<\/FO/{
  7.     p = 0
  8.     if(s == 3)
  9.         exit
  10.     }
« Последнее редактирование: 21 Сентябрь 2016, 15:36:50 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1967
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #8 : 21 Сентябрь 2016, 20:34:00 »
Код sed:
Книжки вот читал-читал (видно не те), и все как бы знакомое,
но туплю, не пойму как это все срабатывает :-\
Может напишите пару-тройку строк принципа как это примерно работает?

что понял:
/<FO/! d - не удалять строки начинающуюся с "<FO"
G - добавить буфер захвата в буфер шаблона
h - копировать буфер шаблона в буфер захвата
/\(<FO.*\)\{3\}/! d - не удалять 3 строки с "<FO"?
s/\n.*// - удалить все от новой строки до конца чего?
:b - метка b
/<\/FO/! - не удалять строки начинающуюся с "<\/FO/"
N - ?
bb - перейти на метку b
q - выйти

Код awk:
Спс, хороший пример, подобное тоже делал, незнал только что 1=print.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #9 : 21 Сентябрь 2016, 21:53:50 »
Не правильно трактуете «//!d». Это не значит «не удалять строки содержащие образец», а «удалять строки не содержащие образец». Разница вроде не большая, но смысл меняется кардинально.
Код: Bash
  1. /\(<FO.*\)\{3\}/! d #для строк НЕ содержащих <FO указанное число раз (3)
  2.                     #перейти к следующей строке (не выводить, начать снова)
  3. s/\n.*//            #удалить все от новой строки до конца (все что добавилось командой G)
  4. /<\/FO/!            #для строки НЕ содержащих </FO выполнять блок в {}
  5. N                   #добавить к имеющимся данным следующую строку
  6. bb                  #перейти на метку b (таким образом выполняют простейший цикл)
« Последнее редактирование: 21 Сентябрь 2016, 21:55:21 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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