Selecione e remova linhas que correspondam a um padrão de um arquivo

1
grep -Eri "drucken" app/views

app/views/meths/_form.html.erb:                                <li class="hidden-phone"><a onclick="javascript: print();" class="">Methode drucken</a></li>
app/views/clients/show.html.erb:                    <li><a onclick="javascript: print();" class="" value="drucken">drucken</a></li>
app/views/clients/index.mobile.html.erb:                                <li class="hidden-xs"><a onclick="javascript: print();" class="">KlientInnen drucken</a></li>
app/views/treatments/index.html.erb:                        <li><a onclick="javascript: print();" class="" value="drucken">drucken</a></li>

Estou procurando uma solução em que eu possa fazer algo como:

grep -Eri "drucken" app/views | xargs INTO_A_FANCY_TOOL_WHICH_REMOVES_THOSES LINES

update:

Eu quero remover essas linhas do arquivo.

    
por PiNg2Eiw 28.02.2015 / 16:51

3 respostas

1

Você tentou algo como:

grep -Eri -l "drucken" app/views | xargs sed -e '/drucken/d' -i

onde '-l' diz ao grep para imprimir apenas o nome do arquivo, '-i' informa ao sed para modificar o arquivo em tempo real.

Como alternativa, você pode fazer loop com sed em todos os arquivos, mas "tocará" em todos eles, mesmo que o arquivo não contenha a palavra solicitada:

find app/views -type f -exec sed -e '/drucken/d' -i {} \;
    
por 28.02.2015 / 17:02
1

Parece que você está procurando por grep -v ?

  -v, --invert-match
         Invert the sense of matching, to select non-matching lines.  (-v
         is specified by POSIX.)

Portanto, grep -v 'drucken' file1 > file2 fornecerá a você file2 com essas linhas removidas.

Alternativamente e não experimentado, algo nos moldes de

sed -e '/drucken/d' infile > outfile
    
por 28.02.2015 / 16:57
1

Você pode usar um perl oneliner para isso:

$ cat file
a
b
c
$ perl -i -wne 'if(/b/){print STDOUT $_}else{print}' file
b
$ cat file
a
c
    
por 28.02.2015 / 17:30