1

Perl find を使用すると、検索文字列で DOCTYPE 宣言を正常にエスケープできません。これは、私が検索している文字列の例です。

find . -type f|xargs -d "\n" perl -pi -e 's/ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1\.0 Transitional//EN" "http://www\.w3\.org/TR/xhtml1/DTD/xhtml1-transitional\.dtd">//g'  

doctype宣言を何も置き換えません。perl find が任意の文字列を見つけられるように、誰かがこの文字列を適切にエスケープできる場合は、大いに感謝します。

4

4 に答える 4

4

別の人が示唆したよう'/'に、正規表現のさまざまな文字を a でエスケープする必要があります。そうしないと'\'、Perl がs///;途中で終了するものとして読み取るため、エラーが発生するからです。これらを扱うときは、特殊文字に常に注意する必要があります。これは、さまざまな期間で行われていることがわかります。

's/ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1\.0 Transitional//EN" "http://www\.w3\.org/TR/xhtml1/DTD/xhtml1-transitional\.dtd">//g' 

a の区切り文字をors///;などの別のもの に変更して、問題を緩和することができます。HTML を使用している場合は、一般的にそうすることをお勧めします。 s###s{}{}

それでも、アプリケーションにとって実用的な限り正規表現を単純化するようにしてください。このような HTML は非常に扱いにくいため、貪欲でない任意の種類の正規表現を使用してみてください。ただし、特定のタグをキャプチャするには<andを使用してください。>たとえば、次のような正規表現を使用できます...

s{<!DOCTYPE .*?>}{}s

そして、やや説明されたフォーマット...

s{
    <!DOCTYPE   # opening doctype tag
    \s          # one whitepsace
    .*?         # anything (even newlines because of /s flag) non-greedily
     >          # until the first closing greater than 
}{}xs;          # x is ignore whitespace, s is have '.' match anything (even \n)

この例では、/xフラグを使用してコメントアウトし、すべてを説明していますが、コマンドラインでこれを行う場合、これは必要ありません。

私はシェルコマンドにあまり詳しくなく、正規表現の部分だけに精通していないため、質問の残りの部分について話すことはできません。

于 2012-11-13T23:15:56.867 に答える
2

/Perl以外の区切り文字を使用できます。これを試して:

s{<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1\.0 Transitional//EN" "http://www\.w3\.org/TR/xhtml1/DTD/xhtml1-transitional\.dtd">}{}g

スラッシュは正規表現を区切っていないため、安全に使用できます。

于 2012-11-13T21:56:14.197 に答える
0

が1行にある場合は、次DOCTYPEのように記述した方がよいでしょう。

find . -type f -exec sed -i '/DOCTYPE/d' {} +

またはでperl

find . -type f -exec perl -i -ne 'print unless /DOCTYPE/' {} +

空白行を維持しないようにします。

ノート

  • -iスイッチはファイルを変更します。テスト目的で削除します
于 2012-11-13T22:03:30.280 に答える
0

代替区切り文字は既にカバーされていますが (例: )、その他のエスケープの必要性を削除するために usingとをs###追加します。\Q\E

s#\Q<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\E##g' 
于 2012-11-14T00:54:56.993 に答える