通过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
脚本说明
- 数组修正:原
availablePlugins的Bash语法有误(元素间带逗号),脚本中已修正为标准Bash数组格式。 - 正则生成:将可用slug转换为
plugin1|plugin3|plugin5的正则串,方便awk批量匹配。 - 块识别与过滤:
- awk会识别每个以
Array(开头的插件数组块,逐行收集内容。 - 当遇到块结束标记
),或);时,检查块内的slug字段是否匹配正则串。 - 仅输出符合条件的插件块,其余块直接跳过。
- 非插件块的内容(如
apply_filters的首尾行)会原样保留。
- awk会识别每个以
注意事项
- 确保
plugin.php的PHP语法基本正确(比如数组元素间的逗号、字符串闭合引号),否则可能导致awk无法正确识别块结构。 - 如果插件数组的缩进、换行格式有特殊变化,可调整awk中的正则匹配规则(比如修改
[[:space:]]*匹配不同的缩进)。
内容的提问来源于stack exchange,提问作者pulla
相关产品推荐
相关产品推荐

