You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"

核心逻辑解释

  1. 捕获所有修饰符到单个组:
    ((public |static |volatile |transient |final |protected |private )+) 外层括号把所有匹配到的修饰符序列(任意顺序、至少一个)整体捕获为组1,不管修饰符顺序如何,都会完整保留所有内容。
  2. 修正类型/方法名匹配:
    原命令里的([[:alnum:]])只能匹配单个字符,改成([[:alnum:]]+)才能匹配Object、Test这类多字符的标识符。
  3. 处理空白和参数:
    [[:blank:]]*匹配方法名和参数括号之间的任意空白,\(([[:alnum:]\,\s]+)\)捕获括号内的参数内容,同时保留括号结构。
  4. 替换规则:
    按照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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:12:26