Como posso sed
filtrar as linhas correspondentes de acordo com alguma expressão, mas ignorar as linhas não correspondentes, em vez de permitir que sejam impressas?
Como um exemplo real, quero executar scalac
(o compilador Scala) em um conjunto de arquivos e ler de sua -verbose
saída os .class
arquivos criados. scalac -verbose
produz um monte de mensagens, mas estamos interessados apenas nas do formulário [wrote some-class-name.class]
. O que estou fazendo atualmente é isso ( |&
é a maneira do bash 4.0 de canalizar o stderr para o próximo programa):
$ scalac -verbose some-file.scala ... |& sed 's/^\[wrote \(.*\.class\)\]$/\1/'
Isso extrairá os nomes dos arquivos das mensagens nas quais estamos interessados, mas também permitirá que todas as outras mensagens passem sem alterações! Claro que poderíamos fazer em vez disso:
$ scalac -verbose some-file.scala ... |& grep '^\[wrote .*\.class\]$' |
sed 's/^\[wrote \(.*\.class\)\]$/\1/'
que funciona, mas se parece muito com o problema real, que é como instruir sed
a ignorar as linhas não correspondentes da entrada. Então, como fazemos isso?
Respostas:
Outra maneira com o sed simples:
s///
é uma substituição,t
sem qualquer rótulo, pula condicionalmente todos os comandos seguintes ed
exclui a linha.Não há necessidade de perl ou grep.
(editado após a sugestão de Nicholas Riley)
fonte
tx
ed
com uma nova linha em vez de um ponto e vírgula como estava começandoundefined label 'x;d;:x'
.sed -e 's/.../.../' -e 'tx' -e 'd' -e ':x'
(sugerido em um comentário sobre uma questão semelhante ).sed -e 's/.../.../' -e 't' -e 'd'
.-e
opção, então não mencione sobre isso em geral.Se você não quiser imprimir linhas que não correspondam, você pode usar a combinação de
-n
opção que diz ao sed para não imprimirp
flag que diz ao sed para imprimir o que é correspondidoIsto dá:
fonte
echo foo | sed -n -e 's/foo/bar/p' -e 's/bar/oof/p'
produzirá ambosbar
eoof
em linhas separadas. Embora a variedade goto-label não possa lidar com vários padrões, pois excluirá a linha se o primeiro padrão não corresponder.Use Perl:
fonte
Não há necessidade de substituição.
fonte
Rapsey levantou um ponto relevante sobre expressões de múltiplas substituições.
{}
(separados por ponto e vírgula;
ou uma nova linha)Sintaxe:
Exemplo (veja aqui o documento para mais detalhes):
Código:
Resultado:
fonte