如何在sed中将任意顺序的多个字符串捕获到单个捕获组
sed捕获任意顺序多字符串到单个捕获组的解决方案
sed的扩展正则(ERE)里,用(A|B)+这种重复捕获组的写法,只会保留最后一次匹配的内容,没法把所有匹配的字符串合并到一个捕获组里。要实现贪婪捕获任意顺序的指定修饰符到单个组,得把整个修饰符序列作为一个整体捕获,同时修正原命令里的正则错误。
修正后的sed命令
sed -i '' -E -e "s/((public |static |volatile |transient |final |protected |private )+)[[:blank:]]+([[:alnum:]]+)[[:blank:]]+([[:alnum:]]+)[[:blank:]]*\(([[:alnum:]\,\s]+)\)/\1\4(\5) -> \3/g"
核心逻辑解释
- 捕获所有修饰符到单个组:
((public |static |volatile |transient |final |protected |private )+)外层括号把所有匹配到的修饰符序列(任意顺序、至少一个)整体捕获为组1,不管修饰符顺序如何,都会完整保留所有内容。 - 修正类型/方法名匹配:
原命令里的([[:alnum:]])只能匹配单个字符,改成([[:alnum:]]+)才能匹配Object、Test这类多字符的标识符。 - 处理空白和参数:
[[:blank:]]*匹配方法名和参数括号之间的任意空白,\(([[:alnum:]\,\s]+)\)捕获括号内的参数内容,同时保留括号结构。 - 替换规则:
按照Swift风格重新拼接:修饰符(组1)+方法名(组4)+参数(组5带括号)+->+返回类型(组3)。
测试验证
输入示例:
private static Object Test (boolean t) public transient volatile Object Test (int k)
执行命令后输出:
private static Test(boolean t) -> Object public transient volatile Test(int k) -> Object
内容的提问来源于stack exchange,提问作者nishant
相关产品推荐
相关产品推荐

