我需要帮助,需要从目录中的所有文件中搜索并删除 3 行代码。
代码是:
if ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) {
include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' );
}
只需要拆除而不是更换。
有任何想法吗?
干杯广告
答案1
perl -0777 -i~ -pe "s{^\\Qif ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) { \E\n\Q include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ); \E\n}\n}{}m" -- dir/*
0777
激活“slurp 模式”,即加载整个文件而不是逐行读取它;-i
“就地”更改文件,创建一个附加到名称的~
备份;~
-p
处理后打印输入;- 该代码只是一个替换
s{}{}
,但在加载整个文件时,它会运行三行; - Final
m
修饰符更改了 : 的行为,^
而不是匹配字符串的开头,而是现在匹配每行开头; - 引号之间的所有内容
\Q...\E
,因此您不必向特殊字符添加反斜杠。
您可以将其与find
子目录中的递归运行结合起来。不过,我们需要更改替换分隔符,如下{}
所示find -exec
:
find /dir -type f -exec perl -i~ -0777 -pe "s<^\\Qif ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) { \E\n\Q include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ); \E\n}\n><>m" -- {} +
答案2
find /dir -type f -print0 \
| xargs -0r grep -Fn "$(cat << 'EOT'
if ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) {
include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' );
}
EOT
)" \
| tac \
| while IFS=: read -r file_name line_number _; do
sed -i "${line_number}d" "$file_name" # You can dry run by commenting out this line.
echo "Removed ${line_number}th line from $file_name"
done
sed
使用行号删除行 by grep
。
grep -n
:显示匹配的行号。grep -F
:匹配固定字符串。它对于性能来说是有效的。- 用于
tac
从后线移除。它可以防止行号更改。 sed -i "${line_number}d" "$file_name"
:$line_number
从......中去除$file_name
。
答案3
我有同样的病毒,但我通过 Notepad++ 删除了文本
if ( file_exists( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' ) ) {\r\n\x20\x20\x20\x20include_once( plugin_dir_path( __FILE__ ) . '/.' . basename( plugin_dir_path( __FILE__ ) ) . '.php' );\r\n}
并将其替换为空格。
答案4
您可以使用以下命令删除包含 PATTERN 的行和以下 n 行(在您的情况下为 2 行):
sed '/PATTERN/,+2d'
第一行的 PATTERN 部分应该可以完成这项工作。