Eu estou olhando para exibir a linha 4598 no arquivo a seguir. Efetivamente, quero exibir a linha APÓS a enésima ocorrência de uma correspondência. Nesse caso, a linha após a 3ª ocorrência de <Car>
. Como faço para fazer isso?
<Car>
10456
</Car>
<Car>
70192
</Car>
<Car>
4598
</Car>
sed
,awk
ou mesmogrep
, é aconselhável fazer uso de um analisador XML.Respostas:
Ou:
Para passar o padrão de pesquisa como uma variável:
Aqui, em
ENVIRON
vez de-v
como-v
expande, as seqüências de escape de barra invertida e barras invertidas são frequentemente encontradas em expressões regulares (portanto, é necessário duplicar-v
).O GNU
awk
4.2 ou superior permite atribuir variáveis como regexps de tipo forte . Desde que seu modo POSIX não esteja ativado (por exemplo, através da$POSIXLY_CORRECT
variável de ambiente, você pode:fonte
Aqui está um perl:
Com o GNU
grep
, você também pode analisar sua saída como:De
man grep
:fonte
Com
GNU awk
você pode fazer:fonte
Aqui está outra maneira de
sed
:Isso está usando o espaço de espera para contar.
Cada vez que encontra uma linha correspondente,
<Car>
elex
muda os buffers e verifica se há exatamente N-1 ocorrências de um caractere no buffer de espera. Se a verificação for bem-sucedida, ela éx
alterada novamente e, se não estiver na última linha, puxa an
linha ext ep
cria o espaço do padrão e, em seguida,q
sai. Caso contrário, ele adiciona outro.
caractere ao espaço de espera eex
volta.fonte
Aqui está uma solução simples de linha de comando.
Se você alterar o valor de +3 depois
tail
, poderá especificar qualquer enésima linha.fonte