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,\K
descarta 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
grep
one,^[^[: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