Digamos que eu tenha um programa blackbox
e um arquivo com o seguinte conteúdo:
in this file
this line contains =TAG=
so does =TAG= this one
as =TAG= does this other line
this line does not
nor does this line
=TAG= here again
gone again
Como posso executar blackbox
somente nas linhas que contêm =TAG=
?
Nota 1: Uma maneira é usar um while read
loop, mas isso é considerado uma prática ruim . Então, qual é a maneira canônica e correta de fazer isso (se houver uma)?
Nota 2: Claro, se eu estivesse apenas editando texto, uma solução com AWK
ou sed
seria apropriada — mas blackbox
pode ter efeitos colaterais desejados. Esta pergunta é para aquelas situações em que preciso executar outro processo .
Nota 3: Você pode perguntar o que acontece se blackbox
for algo como nl
ou sort
—onde executá-lo em várias linhas juntas tem um resultado diferente de executar um novo processo em cada linha. Nesse caso, eu quero ser capaz de fazer isso de cada uma dessas três maneiras :
Por bloco: substitua cada bloco de linhas contíguas contendo
=TAG=
pelo resultado daqueleblackbox
bloco.Saída esperada com
blackbox
=nl
:in this file 1 this line contains =TAG= 2 so does =TAG= this one 3 as =TAG= does this other line this line does not nor does this line 1 =TAG= here again gone again
Linha a linha: substitua cada linha que contém
=TAG=
pelo resultado deblackbox
naquela linha.Saída esperada com
blackbox
=nl
:in this file 1 this line contains =TAG= 1 so does =TAG= this one 1 as =TAG= does this other line this line does not nor does this line 1 =TAG= here again gone again
Continuamente: envia todas as linhas que contêm
=TAG=
umblackbox
processo e substitui cada bloco pelas linhas que seriam impressas antes deblackbox
receber o próximo bloco.Saída esperada com
blackbox
=nl
:in this file 1 this line contains =TAG= 2 so does =TAG= this one 3 as =TAG= does this other line this line does not nor does this line 4 =TAG= here again gone again
(Se usássemos
sort
, todas as linhas correspondentes acabariam classificadas no último bloco correspondente, porque elas não seriam impressas até o final.)
Não encontrei nenhuma pergunta aqui sobre o problema geral, mas todos esses são casos especiais deste problema:
- Como escrever chaves de prefixo de script com barras invertidas (linha a linha)
- Editar arquivo com base na existência de uma string (linha a linha)
- Substituir condicionalmente as linhas do arquivo1 pelas linhas correspondentes do arquivo2 (linha a linha)
- É possível acelerar isso ao ler o script bash? (linha por linha)
- Substituir string pelo conteúdo de um arquivo usando sed (linha a linha)
- alterar nova linha com espaço em determinada condição com sed (bloco a bloco)
- Classificação de blocos de linhas que correspondem apenas à primeira (por bloco)
- Remover linhas que correspondem ao padrão, além de quaisquer linhas que o seguem que correspondem a um padrão diferente (em blocos)
- Substituir linhas que correspondem a um padrão por linhas de outro arquivo em ordem (continuamente)
- Algo como `colar` mas com um alinhamento vertical após um delimitador? (continuamente)
- Passar vários argumentos de linha de comando para um executável com arquivos de texto (continuamente)
- Exclua a enésima linha de cada linha que corresponda a um padrão (continuamente)