Filtrando certas strings da entrada padrão

-1

Eu preciso de um comando Unix que irá tomar entrada canalizada, filtrar certas seqüências e gravar o resto na saída padrão. O problema é que ele precisa ser um comando de uma linha que não depende de nada que não seja enviado para fora da caixa em uma distribuição típica do Linux.

O contexto é que os links 'llvm-config --libs' em um par de arquivos de teste que não deveria, e eu preciso eliminá-los - mas eu preciso fazê-lo dentro de configure.ac.

E a diferença é que não é um item por linha, são todos os itens na mesma linha, separados por espaços e não por linhas novas.

rwallace
fonte

Respostas:

1

grep é um comando Unix / Linux muito comum, pelo menos eu ainda não encontrei nenhuma distro que eu tenha que instalar especificamente grep (vs dizer egrep ou outro comando de filtro).

pegue a entrada canalizada, filtre certas strings e grave o resto na saída padrão.

Para usá-lo assim para filtrá-lo, você poderia fazer o seguinte (assumindo que você está usando cat para imprimir um arquivo para saída padrão)

cat "some_file.txt" | grep -v "text to omit"

Além disso, grep também funciona em arquivos também, então o comando acima poderia ser escrito assim:

grep -v "text to omit" "some_file.txt"

o -v bandeira diz grep para imprimir tudo exceto o texto especificado. Se você quiser uma pesquisa com diferenciação de maiúsculas e minúsculas, precisará especificar -i bandeira.

não é um item por linha, são todos os itens na mesma linha, separados por espaços e não por linhas novas.

Para isso, você pode adicionar um loop for para iterar as palavras e ainda utilizar o grep para obter o que precisa, por exemplo:

for word in "hello there how" are you how "am i today"; do echo $word; done | grep -v "how"

A saída para isso seria:

are
you
am i today

E para ter saída em uma única linha você pode usar o tr comando para traduzir o \n para um espaço:

for word in "hello there how" are you how "am i today"; do echo $word; done | grep -v how | tr '\n' ' '

Aqui a saída seria:

are you am i today 

A primeira parte de for word in é o script de shell for loop. O link fornecido é específico para BASH mas a sintaxe é bem parecida entre as outras shells (pelo menos para CSH, KSH e ASH ), então você pode ter que ajustar para que a sintaxe corresponda ao seu shell específico.

Espero que isso possa ajudar.

txtechhelp
fonte
Ah! De fato, se a entrada fosse um item por linha, mas não é, são todos os itens na mesma linha, separados por espaços e não por linhas novas. É melhor acrescentar isso como um esclarecimento à pergunta.
rwallace
@rwallace, atualizei minha resposta para sua pergunta atualizada :)
txtechhelp
Obrigado, isso parece promissor! Existe uma maneira de transformar a saída novamente em formato de linha única depois? Ou, uma vez que ele precisa terminar em um makefile, talvez eu possa fazer algo como anexar uma barra invertida a cada linha.
rwallace
... infelizmente, acrescentar uma barra invertida a cada linha não funciona, porque ela precisa omitir a barra invertida da última linha.
rwallace
Resposta modificada novamente, apenas canalize essa saída para tr .. por exemplo: for word in blah blah blah; do echo $word; done | grep -v omit | tr '\n' ' '
txtechhelp