如何在MacOS终端批量删除文件中两个标记间的所有内容?
解决Mac Terminal批量删除文件中KEYWORD1之后、KEYWORD2之前内容的问题
Mac自带的是BSD版本sed,和Linux的GNU sed语法差异较大,这是你之前的命令失效的原因。以下是适配Mac环境的解决方案:
单个文件处理
使用sed的静默模式(-n)打印需要保留的内容段:
sed -n '1,/KEYWORD1/p; /KEYWORD2/,$p' filename
这个命令会:
- 打印从文件开头到包含
KEYWORD1的行的所有内容 - 打印从包含
KEYWORD2的行到文件结尾的所有内容
从而自动跳过KEYWORD1之后到KEYWORD2之前的部分。
如果需要直接修改文件(并生成备份),添加-i.bak参数(.bak是备份文件的后缀,可自定义):
sed -i.bak -n '1,/KEYWORD1/p; /KEYWORD2/,$p' filename
批量处理文件
处理当前目录下所有文件(不含子目录)
用循环遍历所有文件:
for file in *; do sed -i.bak -n '1,/KEYWORD1/p; /KEYWORD2/,$p' "$file" done
处理指定类型文件(含子目录)
用find命令递归查找并处理:
find . -type f -name "*.txt" -exec sed -i.bak -n '1,/KEYWORD1/p; /KEYWORD2/,$p' {} \;
把*.txt换成你需要的文件后缀(比如*.md)即可。
注意事项
- 特殊字符转义:如果
KEYWORD1或KEYWORD2包含正则特殊字符(如.、*、/),可以换用其他分隔符(比如|)避免转义:sed -n '1,|KEYWORD_WITH_SLASH|p; |ANOTHER_KEYWORD|,$p' filename - 无匹配情况:如果文件中不存在
KEYWORD1,只会保留KEYWORD2及之后的内容;如果不存在KEYWORD2,只会保留到KEYWORD1的内容。 - 清理备份文件:确认处理无误后,可删除所有备份文件:
rm *.bak
内容的提问来源于stack exchange,提问作者Valerio
相关产品推荐
相关产品推荐

