
在linux环境下,有时我们需要通过命令行自动化地修改php配置文件,例如向一个现有的php数组中追加新的配置项或子数组。一个典型的场景是,在一个名为config.php的文件中,存在一个 $config 数组,我们需要在其中添加一个新的数组元素。
例如,原始的config.php可能如下所示:
<?php $CONFIG = array ( 'installed' => true, 'instanceid' => 'sdsdfsfdsdf', 'ldapProviderFactory' => 'OCA\User_LDAP\LDAPProviderFactory', );
我们希望追加的数组内容是:
  array (
    'class' => '\OC\Files\ObjectStore\S3',
    'arguments' =>
    array (
      'val1' => 'val1x',
      'val2' => 'val1x',
    ),
  ),最终目标是得到一个语法正确的PHP文件:
<?php
$CONFIG = array (
  'installed' => true,
  'instanceid' => 'sdsdfsfdsdf',
  'ldapProviderFactory' => 'OCA\User_LDAP\LDAPProviderFactory',
  array (
    'class' => '\OC\Files\ObjectStore\S3',
    'arguments' =>
    array (
      'val1' => 'val1x',
      'val2' => 'val1x',
    ),
  ),
);直接使用cat命令将新内容追加到文件末尾会导致语法错误,因为这会在 ); 之后添加内容,破坏了PHP数组的结构。而sed虽然功能强大,但在处理多行插入并精确匹配特定行(如数组的闭合括号)之前插入时,其脚本编写可能相对复杂。因此,我们需要一个更灵活、更精确的解决方案。
立即学习“PHP免费学习笔记(深入)”;
awk是一个强大的文本处理工具,它按行处理文件,并允许我们根据模式匹配执行相应的操作。其强大的流程控制和对文件内容的逐行处理能力,使其成为解决此类问题的理想选择。
核心思路是:
为了演示方便,我们将原始PHP数组内容和要添加的新数组内容分别保存到两个临时文件。
orig.txt (模拟原始PHP文件中的数组部分)
$CONFIG = array ( 'installed' => true, 'instanceid' => 'sdsdfsfdsdf', 'ldapProviderFactory' => 'OCA\User_LDAP\LDAPProviderFactory', );
add.txt (要追加的新数组元素)
  array (
    'class' => '\OC\Files\ObjectStore\S3',
    'arguments' =>
    array (
    'val1' => 'val1x',
    'val2' => 'val1x',
    ),
  ),请注意,orig.txt中只包含了 $CONFIG = array (...) 的内容,并且省略了 <?php 标签,这是为了聚焦于数组内容的修改。在实际操作中,您需要处理完整的PHP文件。
创建一个名为 merge.awk 的文件,并写入以下内容:
#!/usr/bin/awk -f
# 遍历输入文件的每一行
!/);/ {
    # 如果当前行不包含 ");" 字符串,则打印该行
    print
}
# 文件处理完毕后执行的END块
END {
    # 使用cat命令将add.txt文件的内容输出到标准输出
    system("cat add.txt")
    # 最后,打印数组的闭合符 ");"
    print ");"
}脚本解释:
首先,确保merge.awk脚本具有执行权限:
chmod +x merge.awk
然后,执行awk脚本,将orig.txt作为输入:
./merge.awk orig.txt
您将在终端看到如下输出:
$CONFIG = array (
  'installed' => true,
  'instanceid' => 'sdsdfsfdsdf',
  'ldapProviderFactory' => 'OCA\User_LDAP\LDAPProviderFactory',
  array (
    'class' => '\OC\Files\ObjectStore\S3',
    'arguments' =>
    array (
    'val1' => 'val1x',
    'val2' => 'val1x',
    ),
  ),
);这个输出正是我们期望的,新的数组元素被成功地插入到了 $CONFIG 数组的闭合括号之前。
在实际操作中,您通常不会将原始文件和追加内容分别保存。您可以直接将PHP配置文件作为awk的输入,并将add.txt替换为包含实际新内容的变量或临时文件。
直接修改原始文件:
为了将输出重定向回原始文件(或新的文件),您可以使用重定向操作符。在进行任何文件修改之前,强烈建议备份原始文件。
# 假设您的原始PHP配置文件是 config.php
# 假设您要添加的内容保存在 add_array_element.txt 中
# 1. 备份原始文件
cp config.php config.php.bak
# 2. 创建 awk 脚本(或直接在命令行使用)
# awk_script.awk
# !/);/ { print }
# END { system("cat add_array_element.txt"); print ");" }
# 3. 执行 awk 并重定向输出到临时文件
awk '!/);/ { print } END { system("cat add_array_element.txt"); print ");" }' config.php > config.php.tmp
# 4. 替换原始文件
mv config.php.tmp config.php
# 5. 清理临时文件(如果需要)
rm add_array_element.txt # 如果 add_array_element.txt 是临时创建的注意事项:
通过awk工具,我们可以优雅且精确地在Linux命令行中向PHP配置文件中的现有数组追加新的数组元素,避免了直接追加可能导致的语法错误。这种方法利用了awk的逐行处理和END块特性,实现了在特定行之前插入内容的需求。掌握这类命令行文本处理技巧,对于自动化配置管理和系统维护具有重要意义。
以上就是通过Awk在Linux命令行中安全地向PHP数组配置添加新条目的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
 
                Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号