从文件中删除长字符串

use*_*341 4 grep sed find text-processing replace

我服务器上的文件已损坏。我想从包含它的所有 PHP 文件中删除一个 13000 个字符串。

字符串看起来像:

?php if(!isset($GLOBALS["\x61\156\x75\156\x61"])) { $ua=strtolower($_SERVER[ ... $qhroczocgv=$qjhvvbyvyv; $qhroczocgv=(729-608); $boxknervrr=$qhroczocgv-1; ?>
Run Code Online (Sandbox Code Playgroud)

为简洁起见插入省略号。

当我使用 搜索字符串时grep,我得到一个

grep:无效的反向引用”尽管转义 \![]$

如何首先找到包含整个字符串的所有文件,然后如何从每个文件中删除文本?

gle*_*man 5

假设您有合适的编码约定,只需删除任何大于特定大小的行:

shopt -s extglob nullglob
sed -i.bak -r '/.{10000}/d' **/*.php
Run Code Online (Sandbox Code Playgroud)

对于@wildcard:

find . -name '*.php' -print0 | while IFS= read -rd "" file; do
    before=$(wc -l < "$file")
    after=$(sed -r '/.{10000}/d' "$file" | wc -l)
    case $(( diff = before - after )) in
        0) :;;  # no-op
        *) echo "will remove $diff lines from $file";;
    esac
done
Run Code Online (Sandbox Code Playgroud)