Shell脚本求助:从源文件夹复制指定行至同名目标文件并修改对应行
Shell脚本问题分析与修正
问题描述
编写Shell脚本实现:遍历源文件夹中的.po文件,复制包含X-WagtailLocalize-TranslationID:的行,然后在目标文件夹的同名文件中修改对应行。现有代码存在多处错误,以下是具体问题和修正方案。
原代码中的错误点
- 误用
open命令:open是macOS用于调用默认应用打开文件的工具,不是Shell读取/写入文件的正确方式,无需用它来操作文件内容。 - 无效的
close_file()写法:Shell中没有这种手动关闭文件的语法,直接通过文件路径操作即可,不需要额外的关闭步骤。 - 变量逻辑混乱:循环里的
file变量被多次错误赋值,先是find输出的文件路径,之后被open的输出覆盖,导致后续操作完全偏离目标文件。 - 未处理目标文件夹:原代码完全没关联目标文件夹的同名文件,根本没实现“修改目标文件对应行”的核心功能。
sed替换逻辑错误:原sed命令只是删除匹配行的部分内容,没有替换成源文件中提取到的TranslationID内容。
修正后的脚本
#!/bin/bash # 检查输入参数是否完整 if [ $# -ne 2 ]; then echo "用法: $0 <源文件夹路径> <目标文件夹路径>" exit 1 fi source_folder="$1" target_folder="$2" # 遍历源文件夹下所有.po文件 find "$source_folder" -type f -name '*.po' | while read -r src_file; do # 获取文件相对路径,匹配目标文件夹中的同名文件 relative_path="${src_file#$source_folder/}" dest_file="$target_folder/$relative_path" # 跳过不存在的目标文件 if [ ! -f "$dest_file" ]; then echo "警告: 目标文件 $dest_file 不存在,跳过" continue fi # 从源文件提取TranslationID行(忽略大小写) translation_id_line=$(grep -i "X-WagtailLocalize-TranslationID:" "$src_file") # 存在目标行才执行替换 if [ -n "$translation_id_line" ]; then # macOS sed需要备份文件,Linux环境可去掉.bak sed -i.bak "/X-WagtailLocalize-TranslationID:/Id" "$dest_file" echo "$translation_id_line" >> "$dest_file" # 删除备份文件 rm "$dest_file.bak" echo "已更新: $dest_file" else echo "警告: 源文件 $src_file 未找到目标行,跳过" fi done
修正说明
- 参数校验:添加参数数量检查,避免用户输入错误。
- 路径匹配:通过相对路径确保找到目标文件夹中的同名文件,保证文件对应关系正确。
- 精准提取:用
grep提取源文件中的目标行,判断存在后再执行修改,避免无效操作。 - 替换逻辑:先删除目标文件中所有匹配的TranslationID行,再将源文件的对应行追加进去;如果需要插入到原位置,可根据.po文件的结构(比如对应msgid块附近)调整
sed逻辑。 - 兼容性:适配macOS的
sed特性(需要备份文件),Linux环境可简化sed命令。
内容的提问来源于stack exchange,提问作者Ben Shaw
相关产品推荐
相关产品推荐

