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

3
所以,我有这个字符串:
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非常相似(我的灵感来源)。

你在意JobDefinition://这部分吗? - undefined
1
关于“我认为这是一个常见的正则表达式问题” - 并没有所谓的通用正则表达式。有BREs、EREs、PCREs以及更多种类的正则表达式,而使用它们的所有工具都有自己的注意事项、分隔符、选项和扩展。例如,在GNU awk、GNU sed和GNU grep中,\s将匹配任何空格,但在其他一些工具中不会匹配,而在perl中则会匹配任何空格。在一些GNU工具中,\w将匹配字母、数字或下划线,但在其他工具中则不会。在perl和使用-P参数调用的GNU grep中,\d将匹配数字,但在sed、awk和其他grep中则不会匹配,等等。这只是冰山一角。 - undefined
我想我是说我并不是在寻找一个特定的sed解决方案,实际上,它与sed无关,那只是我用来测试的方式。事实证明,在PLSQL中它完全正常运行。 - undefined
2个回答

5
你可以使用这个 sed
s='JobDefinition://apps/ess/scm/productHub/itemImport/ItemImportSchedulingJobDef'

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

/a/e/s/p/i/ItemImportSchedulingJobDef

这里:

  • ^[^:]+:/:匹配输入中包括:/在内的初始部分
  • |:或者
  • (/[a-z])[^/]+:匹配/后跟一个小写字母,并将其捕获在第1组中。然后匹配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

我一直在寻找一个单一的正则表达式解决方案,但我猜我没有明确说明。 - undefined
我已经更新了答案(第一个命令),将其改为单个正则表达式并使用了替代。 - undefined

0
这可能适合你(GNU sed):
sed -E ':a;s#(^.*:/|(/.)[^/]+)/#\2/#;ta' file

删除第一个:/及其之前的内容。
然后删除/.../之间的所有字符,并用/和其后的字符替换它们。
可以通过循环实现,使用替换命令、选择和反向引用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接