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

Задача может быть выполнена 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:]_.-]\+\.$'