sed -n 's/.* MATCH: \([^ ]*\).*//p'
Imprimiria a sequência de caracteres não espaciais que seguem a ocorrência mais à direita de " MATCH: "
em todas as linhas correspondentes.
-n
informa sed
para não imprimir o espaço padrão por padrão. E o p
sinalizador para o comando s
informa sed
para imprimir o espaço padrão (portanto, o resultado da substituição) se a substituição for bem-sucedida.
Então o:
sed -n 's/pattern/replacement/p'
é um idioma comum para imprimir o resultado de substituições bem-sucedidas.
Note que o acima assume que a entrada é um texto válido. Como .*
corresponde a qualquer sequência de caracteres , não corresponderá a sequências de bytes que não formam caracteres válidos. Isso normalmente acontece em locales UTF-8 ao processar texto em outra codificação. Se você estiver em tal caso, talvez queira prefixar essa linha acima com LC_ALL=C
. Isso faz com que sed
trate cada byte como um caractere, então não há sequências de bytes inválidas possíveis. Isso funcionaria aqui, pois os caracteres que estamos combinando são todos do conjunto de caracteres portátil.
O padrão awk
não tem nada equivalente, pois não suporta grupos de captura (o \(...\)
capturado em ) em sua função
sub()
.
Lá, você precisa recorrer à função match()
:
awk 'match($0, / MATCH: [^ ]*/) {
print substr($0, RSTART+8, RLENGTH-8)}'
Ou use truques como:
awk -F ' MATCH: ' 'NF>1 {sub(/ .*/, "", $2); print $2}'
(cuidado com aqueles que considerariam a ocorrência mais à esquerda de " MATCH: "
).
O GNU awk
tem uma função gensub()
que possui uma funcionalidade semelhante ao comando sed
' s
, mas um erro de design, pois não informa se alguma substituição foi feita. Aqui você poderia fazer:
gawk '(replacement = gensub(/.* MATCH: ([^ ]*).*/, "\1", 1)) != $0 {
print replacement}'