从所有文件中搜索并删除代码行

从所有文件中搜索并删除代码行

我需要帮助,需要从目录中的所有文件中搜索并删除 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{}{},但在加载整个文件时,它会运行三行;
  • Finalm修饰符更改了 : 的行为,^而不是匹配字符串的开头,而是现在匹配每行开头;
  • 引号之间的所有内容\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 部分应该可以完成这项工作。

相关内容