Bash regex, string de correspondência entre duas strings

1

Estou usando nslookup -q=srv SOME_ADDRESS e quero armazenar os endereços retornados em uma matriz. nslookup retorna:

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.

Eu ainda estou aprendendo regex, eu tenho as strings em uma matriz com:

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

que me fornece [ ]address-3.i.want. , em que [ ] é um espaço em branco.

Como eu combinaria apenas adress-3.i.want sem o espaço no início e . no final? (com regex, não removendo caracteres da string de resultado. Eu sei como fazer isso adicionando outros grep ou cut via pipes, mas tenho certeza que eu poderia apenas editar o regex para fazer o que eu quero)

    
por user3193260 12.08.2016 / 10:06

2 respostas

1

A tarefa pode ser feita pelo GNU sed

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

Em sed

  • -n não imprime linhas no padrão
  • /\.$/s/// remove "." no final da linha
  • T ir para o final (significa imprimir nada se a ação acima não ocorreu)
  • /.* /s///p remove everething até e imprime permanece

ou não-GNU

sed -n '/ /s//\n/;/\n/D;s/\.$//p'
  • / /s//\n/ substituto por n ewline
  • /\n/D remove todos os upto n ewline e começa do início
  • s/\.$//p se remover "." no final da linha resedue impressão
por 12.08.2016 / 12:58
0

Para corresponder a um período, você deve escapar ou incluí-lo entre colchetes. Para excluir o espaço inicial, simplesmente não o adicione ao regex (você corre o risco de selecionar o texto depois de um caractere inválido que não seja um espaço). Finalmente, não há necessidade de incluir a seleção de dígitos mais de uma vez se você usar + (ou seja, pelo menos uma correspondência) em vez de * (zero ou mais correspondências) seguido por uma correspondência especificada:

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

Observe que a expressão regular acima excluiria caracteres maiúsculos e sublinhados. Se você precisar deles, você pode usar [:alnum:] , bem como os símbolos válidos.

array=nslookup -q=srv SOME_ADDRESS | grep -o '[[:alnum:]_.-]\+\.$'
    
por 12.08.2016 / 10:40