Então, eu tenho uma linha:
ID: 54376
Você pode me ajudar a criar uma regex que só retornaria números sem "ID:"?
NOTA: Essa sequência está em um arquivo.
text-processing
regular-expression
Blake Gibbs
fonte
fonte
-o
e-P
são extensões GNU paragrep
.-o
trabalha com os BSDs também. O suporte ao PCRE-P
nem sempre é compilado.Use
egrep
com-o
ougrep
com a-Eo
opção para obter apenas o segmento correspondente. Use[0-9]
como regex para obter apenas números:fonte
Existem muitas maneiras de fazer isso. Por exemplo:
Use o GNU
grep
com PCREs recentes e combine os números depois deID:
:Use
awk
e simplesmente imprima o último campo de todas as linhas que começam comID:
Isso também imprimirá campos que não são números, para obter apenas números e apenas no segundo campo, use
Use o GNU grep com expressões regulares estendidas e analise-o duas vezes:
fonte
\K
está fazendo no primeiro exemplo?-o
para imprimir apenas a parte correspondente, mas também as coisas de descarte Eu não estou interessado em comparar.echo "foobar" | grep -oP "foobar"
Eecho "foobar" | grep -oP 'foo\Kbar'
Isso imprimirá apenas todos os números e espaços que ocorrerem depois
ID: 54376
em qualquer entrada de arquivo.Acabei de atualizar o item acima um pouco para torná-lo um pouco mais rápido
*
e não criarp
linhas em branco após remover os caracteres não {numéricos, espaço}.Ele aborda linhas de regex
/ID: 54376/
,
através do$
passado e sobre eless///
remove todos ou quaisquer*
caracteres^
não[^ 0-9]*
em seguida,p
rints/
qualquer/
linha com um.
carácter restante.DEMO:
RESULTADO:
fonte
Usando sed:
O
-n
é "não imprime nada por padrão", o/^ID: [0-9][0-9]*$/
é "para linhas que correspondem a este regex" (começa com "ID:", depois 1 ou mais dígitos e, em seguida, fim de linha), e os/ID: //p
é do formulários/pattern/repl/flags
-s
significa que está substituindo, para substituir o padrão"ID: "
pelo texto de substituição""
(sequência vazia) usando ap
bandeira, o que significa "imprima esta linha depois de fazer a substituição".Resultado:
fonte
Outro comando GNU sed,
Imprime qualquer número após
ID:
fonte
+
. Se a diferença entre um personagem e 3 caracteres é o seu script pode não funcionar em todossed
s você provavelmente deve fazer:sed -n '/ID: \([0-9][0-9]*\).*/{s//\1/;s/.*[^0-9]//;/./p}'
. Sua resposta também perde a primeiraID: [0-9]
em uma linha contendo duas ocorrências deID: [0-9]
.Use grep + awk:
Bônus: fácil de ler :)
fonte
grep
se estiver usandoawk
.awk '/^ID/ { print $2 }'
faz a mesma coisa e evita problemas de buffer de linha grep . Também é praticamente o mesmo que uma das soluções na resposta do @ terdon.