所以,我有这个字符串:
JobDefinition://apps/ess/scm/productHub/itemImport/ItemImportSchedulingJobDef
我想把它改成:
/a/e/s/p/i/ItemImportSchedulingJobDef
当我使用时:
sed -E 's|/([a-z]{1})|\1|g'
我刚刚明白
JobDefinition:/appsessscmproductHubitemImport/ItemImportSchedulingJobDef
我正在使用 sed,但我认为这是一个一般的正则表达式问题。
它基本上是一个名称间距,而且很长,所以我试图维护一些命名空间和最终的唯一标识符
它非常类似于 springs 压缩完全限定类名的日志记录(我的灵感)
假设您不介意将
JobDefinition://
部分留在原处,那么您实际上已经非常接近了。
这是我想出的。
s|(/[a-z])[a-zA-Z]+|\1|g
我已将捕获组更改为不使用
{1}
,因为它与简单删除它相同,并包含斜杠,否则它会被删除。
您原来的正则表达式没有捕获斜杠之间的字符串的其余部分,因此当您尝试将其替换为捕获组的结果时,它只会粘贴回捕获组的内容以及字符串的其余部分被忽略了。
完整的 sed 命令如下:
sed -E 's|(/[a-z])[a-zA-Z]+|\1|g'
您可以使用sed在线编辑器进行测试
您可以使用这个
sed
:
s='JobDefinition://apps/ess/scm/productHub/itemImport/ItemImportSchedulingJobDef'
sed -E 's~^[^:]+:/~~; s~(/[a-z])[^/]+~\1~g' <<< "$s"
/a/e/s/p/i/ItemImportSchedulingJobDef
这里:
^[^:]+:/~~
:从输入中删除
:/
s~(/[a-z])[^/]+~\1~g
:匹配 /
后跟一个小写字母,并将其捕获到第 1 组中。然后它会匹配 1+ 个非 /
的字符。在替换中,我们放回第一个捕获组的反向引用,即 \1
但是,这假设最后一部分始终以非小写字母开头。
如果不是这种情况,您可以使用带有循环的
sed
命令:
sed -E -e 's~^[^:]+:/~~' -e :a -e 's~(/[a-zA-Z])[^/]+/~\1/~g; ta' <<< "$s"
/a/e/s/p/i/ItemImportSchedulingJobDef