You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过Bash脚本删除plugin.php中未在可用列表的插件数组

用Bash脚本过滤PHP插件数组,保留指定条目

需求背景

我们有一个可用插件slug的Bash数组:

availablePlugins=("plugin1" "plugin3" "plugin5")

还有一个plugin.php文件,内容是通过apply_filters定义的全量插件数组集合:

apply_filters('plugins_filter', Array(
   Array(
      'name' => 'My Plugin1',
      'slug' => 'plugin1',
      'version' => '1.0.2',
      ... etc
   ),
   Array(
      'name' => 'My Plugin2',
      'slug' => 'plugin2',
      'version' => '1.0.2',
      ... etc
   ),
   ... etc
));

需要通过Bash脚本删除不在availablePlugins列表内的插件数组条目,最终仅保留可用插件的数组。

实现脚本

以下是直接可用的Bash脚本,结合awk处理PHP数组的块结构:

# 定义可用插件slug数组(注意Bash数组语法,元素间无需逗号)
availablePlugins=("plugin1" "plugin3" "plugin5")

# 将slug列表转换为awk可识别的正则匹配串(用|分隔多个匹配项)
slug_pattern=$(IFS="|"; echo "${availablePlugins[*]}")

# 使用awk过滤plugin.php,输出符合条件的内容到新文件
awk -v pattern="$slug_pattern" '
in_block=0
block=""

# 匹配单个插件数组的起始行
/^[[:space:]]*Array\(/ {
    if (in_block == 0) {
        in_block=1
        block=$0 "\n"
        next
    }
}

# 收集当前插件数组块的内容
in_block == 1 {
    block=block $0 "\n"
    # 匹配插件数组块的结束行(兼容带逗号和不带逗号的情况)
    if (/^[[:space:]]*\),|^[[:space:]]*\);/) {
        # 检查当前块是否包含指定slug
        if (block ~ /slug[[:space:]]*=>[[:space:]]*[\047"](' pattern ')[\047"]/) {
            print block
        }
        in_block=0
        block=""
    }
    next
}

# 非插件块的内容直接输出
{ print }
' plugin.php > filtered_plugin.php

脚本说明

  1. 数组修正:原availablePlugins的Bash语法有误(元素间带逗号),脚本中已修正为标准Bash数组格式。
  2. 正则生成:将可用slug转换为plugin1|plugin3|plugin5的正则串,方便awk批量匹配。
  3. 块识别与过滤:
    • awk会识别每个以Array(开头的插件数组块,逐行收集内容。
    • 当遇到块结束标记),或);时,检查块内的slug字段是否匹配正则串。
    • 仅输出符合条件的插件块,其余块直接跳过。
    • 非插件块的内容(如apply_filters的首尾行)会原样保留。

注意事项

  • 确保plugin.php的PHP语法基本正确(比如数组元素间的逗号、字符串闭合引号),否则可能导致awk无法正确识别块结构。
  • 如果插件数组的缩进、换行格式有特殊变化,可调整awk中的正则匹配规则(比如修改[[:space:]]*匹配不同的缩进)。

内容的提问来源于stack exchange,提问作者pulla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 11:11:16