Bash regex, строка соответствия из двух строк

Я использую nslookup -q=srv SOME_ADDRESS и хочу сохранить возвращенные адреса внутри массива. Возврат nslookup :

 Server: 123.456.789.123 Address: 123.456.789.123#12 SOME_ADDRESS service = 0 0 1234 address-1.i.want. SOME_ADDRESS service = 0 0 1234 address-2.i.want. SOME_ADDRESS service = 0 0 1234 address-3.i.want. 

Я все еще изучаю регулярное выражение, я получил строки в массив с:

 array=($(nslookup -q=srv SOME_ADDRESS | grep -o ' [a-z0-9.-]*[a-z0-9].$')) 

который дает мне [ ]address-3.i.want. где [ ] – это пробел.

Как бы я совпадал только с adress-3.i.want без места в начале и . в конце? (с регулярным выражением, а не путем удаления символов из строки результата. Я знаю, как это сделать, добавляя еще один grep или cut через каналы, но я уверен, что могу просто отредактировать регулярное выражение, чтобы делать то, что я хочу)

  • Параллелизируйте цикл Bash FOR Loop
  • Как передать список переменных в sed в функции оболочки
  • Объединение нескольких выходов grep в переменную
  • Как использовать одинарные кавычки внутри ssh и sqlplus
  • Bash: собрать две серии файлов
  • команды curl и grep выводятся в новую переменную
  • Команда bash: замените файл «A» на «B» длинной и буквой символа ..?
  • Могу ли я получить код выхода из подклассов, запущенных с помощью $ (команды)?
  • 2 Solutions collect form web for “Bash regex, строка соответствия из двух строк”

    Задача может быть выполнена GNU sed

     nslookup -q=srv "${SOME_ADDRESS}" | sed -n '/\.$/s///;T;/.* /s///p' | mapfile -t array 

    В sed

    • -n не печатать строки по умолчанию
    • /\.$/s/// удалить "." в конце строки
    • T подходит к концу (значит ничего не печатайте, если действие выше не было)
    • /.* /s///p удалять лишнее и распечатывать

    или не-GNU

     sed -n '/ /s//\n/;/\n/D;s/\.$//p' 
    • / /s//\n/ заменить на n ewline
    • /\n/D удалять все выше и начинать с самого начала
    • s/\.$//p если удалить "." в конце строки отменить печать

    Чтобы соответствовать периоду, вы должны либо сбежать от него, либо включить его между квадратными скобками. Чтобы исключить начальное пространство, просто не добавляйте его в регулярное выражение вообще (вы рискуете выбрать текст после некорректного символа, кроме пробела). Наконец, нет необходимости включать выбор цифр более одного раза, если вы используете + (т.е. хотя бы одно совпадение) вместо * (ноль или более совпадений), за которым следует указанное совпадение:

     array=nslookup -q=srv SOME_ADDRESS | grep -o '[a-z0-9.-]\+\.$' 

    Обратите внимание, что вышеописанное выражение исключает заглавные буквы и символы подчеркивания. Если они вам нужны, вы можете использовать [:alnum:] а также действительные символы.

     array=nslookup -q=srv SOME_ADDRESS | grep -o '[[:alnum:]_.-]\+\.$' 
    Interesting Posts

    Есть ли папка, доступная всем процессам и пользователям в любое время?

    Потенциальные проблемы (если они есть) при рекурсивной замене пробелов символами подчеркивания во всех именах файлов на жестком диске

    Как подключиться к серверу Windows на Ubuntu?

    разница между исполняемыми файлами X и Xorg под Debian 6.0 (ядро 2.6.32-5-686)

    Что вызывает эту команду Copy для входа в состояние ожидания?

    Ошибка скрипта, но копирование и вставка из скриптов

    FreeBSD 10: отключить полное шифрование диска ZFS

    Лучший способ сбора случайной выборки из коллекции файлов

    / dev / pts / * группа записывается в разрешениях, но не в действительности

    почему я не могу установить пакеты с rpm? Я получаю «блокировку транзакций»

    Нужно ли настраивать ZFS (используя FreeBSD 10) для файлов на иностранном языке (например, имена файлов на японском / тайском языке / etc)?

    Windows Boot ушел после установки Fedora 26

    Команда zsh Автокоррекция

    Добавление нового жесткого диска в VirtualBox Linux VM и установка его на уже установленную точку монтирования – что происходит со старым контентом?

    Нет свободного места на устройстве, без 320 ГБ

    Linux и Unix - лучшая ОС в мире.