grep com PCRE ( -P ):
grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
-
^[^\d.]*corresponde à parte antes dos primeiros dígitos do início, garantindo também que não há.antes dos dígitos,\Kdescarta a correspondência -
\d+corresponde a um ou mais dígitos -
(?=\.)é um padrão lookahead positivo com largura zero garantindo que haja.na frente
Como haverá várias saídas, é melhor salvá-las em uma matriz:
output=( $(grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt) )
Agora, você pode iterar os elementos da matriz ou usá-los pelas formas usuais de acesso à matriz. para obter o valor do n-ésimo elemento use "${output[n]}" , para obter todos os valores de todas as chaves use "${output[@]}" .
sed :
sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*//' file.txt
-
Semelhante a
grepone,^[^[:digit:].]*corresponde à parte antes dos primeiros dígitos do início, garantindo também que não haja.antes dos dígitos -
([[:digit:]]+)corresponde a um ou mais dígitos e os coloca no grupo capturado 1 -
\..*corresponde a.e depois ao restante -
Na substituição apenas o grupo capturado
é usado
Exemplo:
$ cat file.txt
host01.host.name
host02.host.name
$ grep -Po '^[^\d.]*\K\d+(?=\.)' file.txt
01
02
$ sed -E 's/^[^[:digit:].]*([[:digit:]]+)\..*//' file.txt
01
02