Tente isto:
grep -oP '(?<=ID: )[0-9]+' file
ou:
perl -nle 'print $1 if /ID:.*?(\d+)/' file
Então eu tenho uma linha:
ID: 54376
Você pode me ajudar a fazer um regex que retorne números sem "ID:"?
OBSERVAÇÃO: esta string está em um arquivo.
Tente isto:
grep -oP '(?<=ID: )[0-9]+' file
ou:
perl -nle 'print $1 if /ID:.*?(\d+)/' file
Existem muitas maneiras de fazer isso. Por exemplo:
Use o GNU grep
com PCREs recentes e combine os números depois de ID:
:
grep -oP 'ID:\s*\K\d+' file
Use awk
e simplesmente imprima o último campo de todas as linhas que começam com ID:
awk '/^ID:/{print $NF}' file
Isso também imprimirá campos que não são números, para obter apenas números e somente no segundo campo, use
awk '($1=="ID:" && $2~/^[0-9]+$/){print $2}' file
Use o GNU grep com expressões regulares estendidas e analise-o duas vezes:
grep -Eo '^ID: *[0-9]+' file | grep -o '[0-9]*'
sed -n '/ID: 54376/,${s/[^ 0-9]*//g;/./p}'
Isso imprimirá somente todos os números e espaços que ocorrerem após ID: 54376
em qualquer entrada de arquivo.
Acabei de atualizar um pouco o texto acima para torná-lo um pouco mais rápido com *
e não para p
rint linhas em branco após remover os caracteres não {numéricos, de espaço}.
Ele direciona linhas de regex /ID: 54376/
,
até $
e, nelas, s///
remove todos ou nenhum *
caracteres ^
não [^ 0-9]*
, em seguida p
rints /
any /
linha com um caractere .
restante.
{
echo line
printf 'ID: 54376\nno_nums_or_spaces\n'
printf '%s @nd 0th3r char@cter$ %s\n' $(seq 10)
echo 'ID: 54376'
} | sed -n '/ID 54376/,${s/[^ 0-9]*//g;/./p}'
54376
1 03 2
3 03 4
5 03 6
7 03 8
9 03 10
54376
Use a opção egrep
com -o
ou grep
com -Eo
para obter apenas o segmento correspondente. Use [0-9]
como regex para obter apenas números:
grep -Eo [0-9]+ filename
Usando sed:
{
echo "ID: 1"
echo "Line doesn't start with ID: "
echo "ID: Non-numbers"
echo "ID: 4"
} | sed -n '/^ID: [0-9][0-9]*$/s/ID: //p'
O -n
é "não imprime nada por padrão", o /^ID: [0-9][0-9]*$/
é "para linhas que correspondem a esta regex" (começa com "ID:", depois 1 ou mais dígitos, depois fim de linha), e o s/ID: //p
está no formato s/pattern/repl/flags
- s
significa que estamos fazendo um substituto para substituir o padrão "ID: "
pelo texto de substituição ""
(sequência vazia) usando o p
flag, o que significa "imprima esta linha depois de fazer a substituição".
Saída:
1
4
Outro comando do GNU sed,
sed -nr '/ID: [0-9]+/ s/.*ID: +([0-9]+).*//p' file
Imprime qualquer número após ID:
Use grep + awk:
grep "^ID" your_file | awk {'print $2'}
Bônus: fácil de ler:)