Mac系统文件首行前插入文本及批量处理bash脚本技术咨询
解决Mac OS下的sed插入文本与批量处理问题
嗨,我来帮你搞定这两个问题~要注意的是Mac OS用的是BSD版本的sed,和Linux上的GNU sed语法有点差异,这也是你可能遇到小问题的原因哦。
问题1:在插入的文本后添加回车符(让插入内容正确换行)
你当前的命令在Mac上可能没法正确实现换行,因为BSD sed要求i\后面必须换行再写要插入的内容。如果只是想让"blablabla"作为单独的首行(自带回车,和原文件内容分隔开),正确写法如下:
sed '1i\ blablabla' miFile.txt > myNewFile.txt
这样插入的"blablabla"会成为新的第一行,后面自动带回车,原文件的第一行自然下移到第二行。
如果是想在"blablabla"后面再多加一个回车(也就是插入后跟着一个空行),只需要在插入内容后再加一个换行标识:
sed '1i\ blablabla\ ' miFile.txt > myNewFile.txt
问题2:批量处理指定后缀的文件
要一次性处理文件夹内所有.txtaa/.txtab/.txtac后缀的文件,推荐用循环或者find命令,同时用sed -i实现原地修改(不用手动生成新文件)。Mac的sed -i需要指定备份后缀(比如.bak),处理完可以删掉备份文件避免冗余。
方式1:处理当前目录下的目标文件(不包含子文件夹)
#!/bin/bash # 遍历所有符合后缀的文件 for file in *.txtaa *.txtab *.txtac; do # 原地插入文本,生成.bak备份文件 sed -i.bak '1i\ blablabla' "$file" done # 删除所有生成的备份文件 rm *.bak
方式2:递归处理所有子文件夹里的目标文件
如果需要处理嵌套子文件夹中的文件,用find命令更高效:
#!/bin/bash # 查找所有符合条件的文件并执行sed插入操作 find . -type f \( -name "*.txtaa" -o -name "*.txtab" -o -name "*.txtac" \) -exec sed -i.bak '1i\ blablabla' {} \; # 递归删除所有.bak备份文件 find . -name "*.bak" -delete
这样就能批量完成所有目标文件的首行插入操作啦~
内容的提问来源于stack exchange,提问作者iKK
相关产品推荐
相关产品推荐

