提取斜杠“/”后的第一个字母和最后一个完整单词

Chr*_*rno 3 regex sed

所以,我有这个字符串:

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,但我认为这是一个一般的正则表达式问题。

它基本上是一个命名空间,而且很长,所以我试图维护命名空间和最终唯一标识符的某些内容

它与完全限定类名的 spring 压缩日志记录非常相似(我的灵感)

anu*_*ava 5

你可以使用这个sed

s='JobDefinition://apps/ess/scm/productHub/itemImport/ItemImportSchedulingJobDef'

sed -E 's~^[^:]+:/|(/[a-z])[^/]+~\1~g' <<< "$s"

/a/e/s/p/i/ItemImportSchedulingJobDef
Run Code Online (Sandbox Code Playgroud)

这里:

  • ^[^:]+:/:匹配:/输入之前和包含的初始部分
  • |: 或者
  • (/[a-z])[^/]+:匹配/后跟小写字母并将其捕获到组 #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
Run Code Online (Sandbox Code Playgroud)