Quero pegar os dois últimos números (um int, um float; seguido pelo espaço em branco opcional) e imprimi-los apenas.
Exemplo:
foo bar <foo> bla 1 2 3.4
Deve imprimir:
2 3.4
Até agora, tenho o seguinte:
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p'
vai me dar
foo bar <foo> bla 1 replacement
No entanto, se eu tentar substituí-lo pelo grupo 1, toda a linha será impressa.
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/\1/p'
Como posso imprimir apenas a seção da linha que corresponde à regex do grupo?
-r
opção `--regexp-extended`, caso contrário, estava recebendoinvalid reference \1 on
o erro RHS` do comando s '.(
e em)
vez de\(
e\)
..*
ao final da regexp se a sequência que você deseja extrair nem sempre estiver no final da linha..*
é ganancioso e sed não tem um não-gananciosos.*?
(
e)
não gerará erros no ubuntu 16.04. Então, acho que esse comentário está desatualizado.O grep é a ferramenta certa para extrair.
usando seu exemplo e sua regex:
fonte
grep -o
chamadas canalizadas . stackoverflow.com/a/58314379/117471E para mais uma opção, eu usaria o awk!
Isso dividirá a entrada (eu estou usando STDIN aqui, mas sua entrada pode ser facilmente um arquivo) em espaços e, em seguida, imprima o campo menos um, e depois o último campo. As
$NF
variáveis mantêm o número de campos encontrados após a explosão nos espaços.O benefício disso é que não importa se o que precede os dois últimos campos muda, desde que você queira apenas os dois últimos, ele continuará funcionando.
fonte
O comando de corte foi projetado para esta situação exata. Ele será "cortado" em qualquer delimitador e, em seguida, você poderá especificar quais blocos devem ser gerados.
Por exemplo:
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
Resultará na saída de:
2 3.4
-d define o delimitador
-f seleciona o intervalo de 'campos' para saída, neste caso, são os sexto a sétimo a sétimo da seqüência original. Você também pode especificar o intervalo como uma lista, como
6,7
.fonte
awk '{ print $2" "$6 }'
cut -d " " -f 2,6
Concordo com @kent que isso é adequado
grep -o
. Se você precisar extrair um grupo dentro de um padrão, poderá fazê-lo com um segundo grep.fonte