Excluindo Linhas Contendo uma Cadeia Especificada em Arquivos Diferentes

2

Suponha que haja dois arquivos em web/ com o nome foo.php e bar.php . A primeira linha de foo.php é "sdajgeSTRINGdsad" e a 10ª linha de bar.php é "gdfhu98324STRING". A tarefa é primeiro localizar esses dois arquivos, depois excluir a primeira linha de foo.php e a 10ª linha de bar.php, desde que a string especificada seja "STRING".

    
por Covi 28.07.2011 / 09:35

5 respostas

5

sed pode fazer isso:

sed -i.bak '/STRING/d' web/*
    
por 28.07.2011 / 09:51
2

Para encontrar um arquivo que contenha uma string, use grep . Se você quiser descobrir quais arquivos contêm STRING em web/ e todos os subdiretórios:

grep -R "STRING" web /

Para editar um arquivo e remover linhas contendo uma string, há muitas opções, mas aqui estão duas comuns. Como você quer operar em linhas inteiras, isso é realmente fácil:)

Primeiro, você pode usar grep com o argumento -v para reverter a pesquisa e ocultar as linhas correspondentes da saída, em vez de exibi-las. Para o seu primeiro arquivo, vamos fazer isso usando sponge . Isso nos permitirá ler o arquivo, filtrá-lo e, em seguida, gravá-lo no mesmo arquivo em um único movimento:

grep -v "sdajgeSTRINGdsad" foo.php | sponge foo.php

Para o seu segundo exemplo, faremos a mesma coisa com grep , mas se você não tiver sponge , poderá gravá-lo em um arquivo diferente e, em seguida, mover esse arquivo de volta ao nome original:

grep -v "gdfhu98324STRING" bar.php  > bar.php.cleaned
mv bar.php{.cleaned,}

A segunda maneira seria usar sed com o comando d line delete. Para o seu primeiro exemplo, usaremos a edição do arquivo no local com a opção de criar um arquivo .bk backup:

sed -i.bk '/sdajgeSTRINGdsad/d'  foo.php

Praticamente a mesma coisa pode ser feita copiando o arquivo você mesmo usando o sed para filtrar o backup e sobrepor o original:

cp bar.php bar.php.bk
sed '/gdfhu98324STRING/d' bar.php.bk > bar.php

Agora, combine essas duas tarefas! Vamos criar uma função para que você possa fazer isso repetidamente com strings diferentes:

function nuke_string () {
    string="$1"
    path="$2"
    grep -R -l "$string" "$path" | while IFS= read -r file; do
        sed -i.bk "/$string/d" "$file"
    done
}

Depois de criar essa função, você pode usá-la assim:

nuke_string "STRING" web/

Todos os arquivos contendo STRING na web / teriam essas linhas removidas e uma cópia de backup seria feita da versão original. Você pode criar uma função como esta no seu shell atual ou pode escrevê-la no seu arquivo .bashrc e tê-la sempre disponível.

    
por 28.07.2011 / 09:43
2

Use apenas grep -l juntamente com -R ! Aqui está um one-liner completo:

grep -Rl "STRING" web/ | xargs sed -i "/STRING/d"
    
por 29.07.2011 / 12:39
0

Existem duas alternativas:

  1. use find para localizar recursivamente seus arquivos (por exemplo, *.php files) e perl ou o sabor GNU de sed (ambos têm a opção -i ) para executar a exclusão.

  2. O que você está pedindo parece uma operação de refatoração: altere o nome de um elemento de código em todos os lugares na base de código. Se meu palpite estiver correto, você deve verificar os IDEs capazes de lidar com php development.

por 28.07.2011 / 10:44
0

Você pode usar o Vim no modo Ex:

for k in web/*.php
do
  ex -sc '/STRING/d|x' "$k"
done
  1. d delete

  2. x salvar e fechar

por 17.04.2016 / 08:21