编写Shell脚本批量替换文件第三行指定内容为无扩展名文件名
解决方案:批量替换文件第3行的"location"为无扩展名文件名
嘿,这个需求很好实现,我给你写个靠谱的Shell脚本,还考虑了文件名带空格、特殊字符的坑,来看看:
脚本代码
直接复制下面的脚本,保存为replace_location.sh,然后给它加执行权限chmod +x replace_location.sh就能运行:
#!/bin/bash # 设置要处理的目标目录,当前目录用./,可自行修改成实际路径 TARGET_DIR="./" # 遍历目录下的所有文本文件(如果你的文本文件没有统一后缀,可去掉 -name "*.txt") find "$TARGET_DIR" -type f -name "*.txt" | while read -r file; do # 提取无扩展名的文件名(比如把 "example.txt" 变成 "example") filename=$(basename "$file" | cut -d. -f1) # 处理文件名中的特殊字符(比如/、&),避免sed替换出错 safe_filename=$(echo "$filename" | sed 's/[\/&]/\\&/g') # 原地修改第3行,把"location"替换为无扩展名文件名 sed -i "3s/location/$safe_filename/" "$file" done
关键部分解释
- 目录设置:
TARGET_DIR变量指定要处理的文件夹,默认是当前目录,你可以改成实际路径比如/home/user/documents/ - 文件遍历:用
find命令遍历目标目录下的所有.txt文件,如果你的文本文件没有统一后缀,删掉-name "*.txt"即可,但注意只处理文本文件,别误改二进制文件 - 提取文件名:
basename去掉文件路径,cut -d. -f1截取第一个.之前的部分,得到无扩展名的文件名 - 特殊字符处理:如果文件名里有
/或者&这类sed敏感字符,safe_filename的处理会给它们加转义符,避免替换失败 - sed替换:
3s/location/$safe_filename/表示只修改第3行,把该行里的"location"替换成我们提取的文件名,-i参数是原地修改文件
注意事项
- 如果你用的是macOS系统,sed的
-i参数需要加空字符串,改成sed -i "" "3s/location/$safe_filename/" "$file" - 建议先备份文件再运行脚本!可以先把
sed -i改成sed,这样会把修改后的内容输出到终端,确认没问题再改成原地修改 - 如果你的文件编码有特殊情况,可能需要给sed加编码参数,比如
sed -i -e 's/.../',不过一般文本文件不用额外处理
内容的提问来源于stack exchange,提问作者7pkbea
相关产品推荐
相关产品推荐

