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 через каналы, но я уверен, что могу просто отредактировать регулярное выражение, чтобы делать то, что я хочу)

  • Почему читать -r есть текст?
  • В команде не работает
  • Как узнать, существует ли каталог?
  • Считать общее количество строк до / после соответствия шаблону
  • PHP-скрипт, который называет nano
  • Чтение пользовательского ввода с чтением
  • как проверить строку Null или нет в сценарии оболочки?
  • Как я могу удалить файл защиты, сделанный tee?
  • 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:]_.-]\+\.$' 
    Linux и Unix - лучшая ОС в мире.