egrepはファイルの内容を検索するときにスペースを無視します。

egrepはファイルの内容を検索するときにスペースを無視します。

これは私の構文です。

egrep -lir --include="*.php" '<? ' > ./wrongtag.txt

コンソール/ターミナルで直接使用します(スクリプトなし)。

役に立たない。約200のWebサイトを含むサーバー全体がcPanelからPleskに移動されました。急速にオープンなPHPタグは新しいサーバーで有効/サポートされておらず、さまざまなWebサイトで時々エラーが発生することがあります。検索結果をファイルにダンプすると問題を解決できると思いましたが、コマンドは末尾のスペースを無視してすべての<?* .phpファイル(不要)を返します。

その中に含まれるすべての* .phpファイルをどのようにegrep返すことができますか?<?

ベストアンサー1

使用中の正規表現は拡張正規表現(ERE)<? と共に使用されます。egrepERE では?「前の文字が 1 回または 0 回発生する」を意味するため、正規表現は「0 または 1 の<後にスペースが続く項目を検索する」を意味します。つまり、<リテラルを使用するには、?スペースをすべて検索する必要があります(grep -E '<\? ')。

または、実際に使用したい拡張正規表現機能がないので、ここでは使用しないでくださいegrepegrepもう使用されていないので、とにかく使用してください)。grep -Eしたがって、次のことを試してください。

grep -lr --include="*.php" '<? ' > ./wrongtag.txt

-iパターンに文字がないため、小文字や大文字にできない文字も削除しました。

最後に、すべてのPHPファイルからこれらのタグを削除するには、sedとfindを使用して1つのステップで簡単に実行できます。

find . -name '*.php' -exec sed -i.bak 's/<? //' {} +

これにより、各ファイルのバックアップコピーが作成され(ファイルにfoo.phpなりfoo.php.bak)、元のファイルからタグが削除されます。タグが含まれている行全体を削除したい場合(PHPはタグが行の唯一のものだと思います。そうですか?)タグ以外には何もない行をすべて削除できます。

find . -name '*.php' -exec sed -i.bak '/^ *<? *$/d' {} +

おすすめ記事