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

Sed转换NFSv4 ACL格式时组输入捕获组失效的问题求助

Sed转换NFSv4 ACL格式时组输入捕获组失效的问题求助

看起来你遇到的问题根源是正则的匹配逻辑没覆盖到所有输入场景,而且把用户和组的替换需求混在一起处理了,咱们一步步捋清楚:

首先看你当前的sed命令里的第二个正则:

s/(u|user|roup):([A-Za-z0-9]*):(.*)/:\2@company.com:\3/

这里有两个明显的问题:

  1. 完全没包含对单个g的匹配项,所以当输入g:group1:RX时,这个正则根本匹配不上,自然不会执行替换逻辑,只会保留前面s/^/A:/的结果,也就是A:g:group1:RX。
  2. roup是group的笔误——虽然输入group:group1::RX时能碰巧匹配到后面的roup部分,但这纯属凑巧,不是正确的写法。

另外,我注意到你对用户和组的格式需求是不一样的:

  • 对于u/user开头的条目,你需要去掉类型标识,变成A::xxx@company.com:...
  • 对于g/group开头的条目,你需要保留g标识,变成A:g:xxx@company.com:...

把这两种不同逻辑的替换放在同一个规则里肯定不行,咱们分开处理就清晰多了。给你修正后的sed命令:

sed -E '
    s/^/A:/;
    # 处理用户条目:把u/user替换成空白前缀
    s/(u|user):([A-Za-z0-9]*):(.*)/:\2@company.com:\3/;
    # 处理组条目:把g/group替换成带g的前缀
    s/(g|group):([A-Za-z0-9]*):(.*)/:g:\2@company.com:\3/
'

咱们测试几个场景:

  • 输入u:user1:RWX → 输出A::user1@company.com:RWX(和你之前的正确结果一致)
  • 输入g:group1:RX → 输出A:g:group1@company.com:RX(现在能正确添加上域名后缀了)
  • 输入group:group1::RX → 输出A:g:group1@company.com::RX(符合你的预期)

如果要处理逗号分隔的多个条目(比如你测试用的u:user1:RWX,g:group1:RX),可以稍微调整一下,先把逗号拆成换行处理,最后再合并回来:

echo "u:user1:RWX,g:group1:RX" | tr ',' '\n' | sed -E '
    s/^/A:/;
    s/(u|user):([A-Za-z0-9]*):(.*)/:\2@company.com:\3/;
    s/(g|group):([A-Za-z0-9]*):(.*)/:g:\2@company.com:\3/
' | tr '\n' ',' | sed 's/,$//'

执行后就能得到正确的逗号分隔结果:A::user1@company.com:RWX,A:g:group1@company.com:RX

备注:内容来源于stack exchange,提问作者Yehuda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 10:33:08