You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何批量替换指定目录下文件中的特定代码内容?

如何批量替换指定目录下文件中的特定代码内容?

嘿,这个批量替换的需求其实不难搞定,我给你准备了两种常用环境下的解决方案——Shell脚本(适配Linux/macOS)和PowerShell(适配Windows),都能精准完成你要的两个替换操作:

一、Linux/macOS 用Shell脚本实现

你可以创建一个.sh脚本,执行后就能批量处理目标目录下的文件:

#!/bin/bash

# 替换成你实际要处理的目录路径,比如 ./project-files
TARGET_DIR="./your-target-folder"

# 第一步:全局替换密码行——把 $pw = 'my_password' 换成 $pw = $new_pw
find "$TARGET_DIR" -type f -name "*.php" -exec sed -i '' "s/\$pw = 'my_password'/\$pw = \$new_pw/g" {} \;

# 第二步:只在包含过原密码行的文件中,替换开头的<?php
# 先筛选出符合条件的文件,再逐个处理
find "$TARGET_DIR" -type f -name "*.php" -exec grep -l "\$pw = 'my_password'" {} \; | while read file; do
  # 确保只替换单独一行的<?php,并且添加换行和include语句
  sed -i '' "s/^<?php$/<?php\ninclude('passwords.php');/" "$file"
done

脚本说明:

  • find 命令用来遍历目标目录下所有指定后缀的文件(这里是.php,如果是其他文件可以修改-name参数)
  • 第一个sed命令是全局替换密码行,注意要转义$避免被Shell解析成变量
  • 第二个步骤先通过grep -l筛选出包含原密码行的文件,再用sed替换开头的<?php^$确保是整行匹配,不会误改带注释的<?php
  • 注意:Linux下的sed不需要-i后面的空字符串,把sed -i ''改成sed -i即可

二、Windows 用PowerShell实现

打开PowerShell,执行以下脚本(记得替换目标目录路径):

# 替换成你实际要处理的目录路径,比如 .\project-files
$targetDir = ".\your-target-folder"

# 第一步:批量替换密码行
Get-ChildItem -Path $targetDir -Filter "*.php" -Recurse | ForEach-Object {
  # 读取文件内容并替换,然后写回文件
  (Get-Content $_.FullName) -replace '\$pw = ''my_password''', '\$pw = \$new_pw' | Set-Content $_.FullName
}

# 第二步:在包含原密码行的文件中替换<?php
Get-ChildItem -Path $targetDir -Filter "*.php" -Recurse | Where-Object {
  # 判断文件是否包含原密码行
  (Get-Content $_.FullName) -match '\$pw = ''my_password'''
} | ForEach-Object {
  # 读取整个文件内容,确保整行替换<?php
  $content = Get-Content $_.FullName -Raw
  $content = $content -replace '^<\?php$', "<?php`ninclude('passwords.php');"
  Set-Content $_.FullName -Value $content
}

脚本说明:

  • Get-ChildItem 用来递归遍历目标目录下的.php文件
  • -replace 实现字符串替换,PowerShell里单引号需要用两个单引号转义
  • -Raw 参数让Get-Content读取整个文件为字符串,确保能精准匹配单独一行的<?php
  • n 是PowerShell里的换行符,保证include语句在<?php`的下一行

重要注意事项

  • 先备份! 批量替换前一定要把目标目录备份一份,避免脚本出错导致文件损坏
  • 如果你的文件不是.php后缀,修改脚本里的-name "*.php"(Shell)或-Filter "*.php"(PowerShell)参数即可,甚至可以去掉该参数处理所有文件
  • 测试时可以先找一个测试文件单独运行脚本验证效果,再批量处理

备注:内容来源于stack exchange,提问作者D-T

火山引擎 最新活动