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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

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

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

Оффлайн ALiEN

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

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

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

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

🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Pilot6

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

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

Оффлайн ReNzRv

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

Оффлайн Azure

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

Оффлайн ALiEN

  • Автор темы
  • Администратор
  • Старожил
  • *
  • Сообщений: 6726
  • 20% Cooler
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #4 : 21 Сентября 2016, 01:16:06 »
Azure, большое спасибо! Сколько примеров по sed видел - ни в одном такая простая конструкция (gp) не приводилась.
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Azure

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

Оффлайн ReNzRv

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

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: помогите с рег. выражением
« Ответ #7 : 21 Сентября 2016, 15:15:47 »
Код: (sed) [Выделить]
#!/bin/sed -f

/<FO/! d
G
h
/\(<FO.*\)\{3\}/! d
s/\n.*//
:b
/<\/FO/! {
    N
    bb
    }
q

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

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
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

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

 

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