sed如何将文件中的指定关键词替换为对应目录下的目标文件名
脚本错误原因与修复方法
核心错误原因
你给变量l赋值的逻辑不符合需求:
sed "${i}q;d" 目标文件命令的作用是读取指定文件的第i行内容,你把.dat文件的路径传入sed,最终拿到的自然是文件内容,而非你预期的文件名。- 按照你给出的命名规则,
.dat文件名可以直接通过子目录数字计算得到,完全不需要读取文件或者调用额外命令。
修正后的脚本方案
批量处理所有子目录版本
可以直接遍历父目录下所有数字命名的子目录,自动完成所有替换:
find_replace_old_file_name="old_file_name" # 替换为你的父目录实际路径 parent_dir="./parent" # 遍历所有数字命名的子目录 for daughter_path in "$parent_dir"/[0-9]*; do # 提取子目录的数字名称 daughter_num=$(basename "$daughter_path") # 按规则构造dat文件名 target_dat_name="$((daughter_num * 1000)).dat" # 可选:判断对应dat文件是否存在,避免无效替换 if [ -f "${daughter_path}/data/${target_dat_name}" ]; then # 执行替换,macOS系统请把sed -i改成sed -i '' sed -i "s/${find_replace_old_file_name}/${target_dat_name}/g" "${daughter_path}/input" fi done
单子目录处理版本(适配你原有写法)
如果是每次传入单个daughter变量处理单个子目录,可以直接简化为:
find_replace_old_file_name="old_file_name" # daughter为传入的子目录数字 target_dat_name="$((1000 * daughter)).dat" # 执行替换,macOS系统请把sed -i改成sed -i '' sed -i "s/${find_replace_old_file_name}/${target_dat_name}/g" "parent/${daughter}/input"
内容的提问来源于stack exchange,提问作者Ant
相关产品推荐
相关产品推荐

