MacOS Terminal中find与正则表达式问题求助
解决Mac终端删除YAML文件中UUID开头行的问题
我完全能理解你折腾近24小时的烦躁——Mac自带的BSD系工具(比如sed)和Linux上的GNU工具确实有不少容易踩的差异,尤其是正则和命令参数这块。
先给你能直接用的正确命令
要删除当前目录下所有.yml文件中以uuid开头的整行,不需要用替换命令,直接用sed的删除命令就可以了:
find . -name '*.yml' -print0 | xargs -0 sed -i '' '/^uuid/d'
这个命令的核心是/^uuid/d:sed会匹配所有以uuid开头的行,直接执行删除操作,整行包括换行符都会被移除,不会留下空白行。
为什么你之前的命令无效?
- 第一个命令
sed -i '' -e 's/^uuid.*\n/g':sed默认是逐行处理的,读入每一行时会自动去掉末尾的换行符,所以.*\n根本匹配不到内容,自然无法删除整行。 - 第二个命令
sed -i '' -e 's/^uuid://g':这只是替换掉了行首的uuid:字符串,行里剩下的内容还会保留,所以达不到删除整行的效果。
MacOS正则相关的文档参考方向
如果你想深入了解Mac上的正则和工具差异,推荐这几个本地文档:
- 直接查看sed的手册页:在终端输入
man sed,里面会详细说明BSD sed支持的正则语法(默认是基本正则表达式BRE),以及和GNU sed的参数差异,比如BSD sed的-i参数必须加空字符串作为备份后缀(如果不需要备份的话)。 - 查看系统正则格式手册:输入
man re_format,这是BSD系统专门的正则表达式规范文档,涵盖了sed、grep、awk等所有系统工具支持的正则语法,能帮你理清不同场景下的正则写法差异。 - 如果习惯Linux的GNU工具,可以通过Homebrew安装
gnu-sed(安装后命令是gsed),这样就能用你熟悉的GNU sed语法和参数,避免BSD和GNU的差异坑。
内容的提问来源于stack exchange,提问作者Jason Glisson
相关产品推荐
相关产品推荐

