Primeiramente, concordo com os comentários acima: Não use sed
para se recuperar de ser hackeado. Você sempre se perguntará se perdeu alguma coisa. Restaurar do backup, ponto final.
No entanto, a pergunta literal que você fez, como remover uma longa string em todos os lugares que aparece sem escapar de todos os caracteres especiais, é um pouco mais fácil de lidar.
Estou fazendo algumas inferências / suposições de sua pergunta que você não declarou diretamente:
- A string a ser removida é uma única linha.
- Que é o mesmo sempre que ocorre.
- Isso precisa ser removido e não substituído por outra coisa.
Se as suposições acima estiverem corretas, faça o seguinte:
- Coloque a string a ser removida (incluindo qualquer espaço em branco) em um arquivo, chamada, por exemplo, %código%. Coloque este nível acima do diretório que você irá manipular.
-
Copie todo o seu diretório em caso de erros.
cp -a mydir mydircopy
-
Execute o seguinte loop no seu diretório (ou na cópia) para remover todas as instâncias do hackline:
cd mydir for f in *; do [ -f "$f" ] && [ -r "$f" ] || continue grep -vxFf ../hackline.txt "$f" > "$f.fixed" && mv -- "$f.fixed" "$f" done
O conceito aqui é que você usa hackline.txt
como uma lista de sequências fixas que devem corresponder à linha inteira, então você usa hackline.txt
para obter apenas as linhas que não correspondem lista de strings.
grep
significa "linha inteira"; -x
significa "string fixa, não regex"; -F
inverte a pesquisa; -v
aceita uma lista de padrões em um arquivo.
Se o diretório do seu site for hierárquico em vez de simples (o que é bastante provável), você poderá usar -f
em vez de um loop for:
find mydir -type f ! -name \*.fixed -exec sh -c 'grep -vxFf ../hackline.txt "$1" > "$1.fixed"' sh {} \;
find mydir -type f -name \*.fixed -exec sh -c 'mv -- "$1" "${1%.fixed}"' sh {} \;
Em seguida, use um find
recursivo para verificar se tudo está como deveria estar:
diff -r mydircopy mydir