使用Bash提取Swift函数名并插入#Mark标记行
解决Swift函数自动添加#Mark标记的问题
我来帮你搞定这个Swift函数的标记插入需求!你之前用grep和sed没成功,主要是没把正则分组提取和替换逻辑结合好,试试下面的sed命令,完美实现你要的效果:
核心命令
通用版本(输出到新文件)
sed -E 's/^[[:space:]]*func[[:space:]]+([a-zA-Z0-9_]+).*/#Mark \1\n&/' input.swift > output.swift
直接修改原文件
- Linux环境:
sed -i -E 's/^[[:space:]]*func[[:space:]]+([a-zA-Z0-9_]+).*/#Mark \1\n&/' input.swift
- macOS环境(macOS的
sed需要额外的空参数给-i):
sed -i '' -E 's/^[[:space:]]*func[[:space:]]+([a-zA-Z0-9_]+).*/#Mark \1\n&/' input.swift
命令解释
让我拆解下这个命令的逻辑,帮你理解为什么它能工作:
-E:启用扩展正则表达式,让我们可以用更简洁的分组语法^[[:space:]]*:匹配行首的任意空白字符(空格、制表符都算),兼容Swift代码里的缩进格式func[[:space:]]+:匹配func关键字和后面的一个或多个空格([a-zA-Z0-9_]+):核心分组,捕获Swift函数名(函数名允许字母、数字、下划线),这部分就是我们要提取的内容.*:匹配函数行剩下的所有内容(参数列表、大括号等)#Mark \1\n&:替换规则:\1:引用刚才捕获的函数名\n:插入换行符,让标记行单独占一行&:代表原来匹配的整行函数代码
效果演示
输入代码:
func showProductsList(result: UserResult<[Product]>) { } func showFetchNextSliceFailed(result: UserResult<[Product]>) { }
运行命令后输出:
#Mark showProductsList func showProductsList(result: UserResult<[Product]>) { } #Mark showFetchNextSliceFailed func showFetchNextSliceFailed(result: UserResult<[Product]>) { }
完全符合你想要的结果!如果你的函数名有特殊字符(比如Swift允许的下划线开头、或者包含Unicode字符),可以调整正则里的捕获组部分,比如把[a-zA-Z0-9_]改成[\p{L}\p{N}_]来支持Unicode字母数字,不过大部分场景下默认的正则就够用了。
内容的提问来源于stack exchange,提问作者Mehul Parmar
相关产品推荐
相关产品推荐

