用于提取斜杠“/”后的第一个字母和最后一个完整单词的正则表达式

问题描述 投票:0回答:2

所以,我有这个字符串:

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 压缩完全限定类名的日志记录(我的灵感)

regex sed
2个回答
0
投票

假设您不介意将

JobDefinition://
部分留在原处,那么您实际上已经非常接近了。

这是我想出的。

s|(/[a-z])[a-zA-Z]+|\1|g

我已将捕获组更改为不使用

{1}
,因为它与简单删除它相同,并包含斜杠,否则它会被删除。

您原来的正则表达式没有捕获斜杠之间的字符串的其余部分,因此当您尝试将其替换为捕获组的结果时,它只会粘贴回捕获组的内容以及字符串的其余部分被忽略了。

完整的 sed 命令如下:

sed -E 's|(/[a-z])[a-zA-Z]+|\1|g'

您可以使用sed在线编辑器进行测试


0
投票

您可以使用这个

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
© www.soinside.com 2019 - 2024. All rights reserved.