Excluindo todas as linhas após a primeira ocorrência de uma string em uma linha

3

Eu tenho um arquivo grande test.txt como este exemplo:

foo
before ...
before some line 
foo something interesting bar
after some lines
after ...
bar

Como faço para criar um novo arquivo apenas com as linhas antes da primeira ocorrência da string " something interesting " com comandos bash básicos como sed ou grep (não awk , preciso disso em um arquivo incorporado dispositivo sem awk)?

    
por rubo77 22.07.2017 / 11:22

1 resposta

8
sed '/something interesting/,$d' < file > newfile

Qual pode ser otimizado para:

sed -n '/something interesting/q;p' < file > newfile

para que sed seja encerrado assim que encontrar o padrão.

Qual com a implementação GNU de sed , como observado por @RakeshSharma, pode ser simplificado para

sed '/something interesting/Q' < file > newfile

Para truncar o arquivo no local, com ksh93 em vez de bash , você poderia fazer:

printf '' <>; file >#'*something interesting*'
  • <>; é como o operador padrão de redirecionamento <> (aberto em leitura + gravação), exceto que o arquivo será truncado no final se o comando for bem-sucedido.
  • <#pattern procura o início da próxima linha que corresponde ao padrão.

(note que parece funcionar (com pelo menos ksh93u +) com printf '' no stdout mas não com outros comandos incorporados como true , : ou eval . Parece um bug . Também não pode ser o último comando de um script ( outro bug ).

    
por 22.07.2017 / 11:28