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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:43:12