【问题标题】:Grep Exported-Packages from a MANIFEST.MF file来自 MANIFEST.MF 文件的 Grep 导出包
【发布时间】:2015-10-30 13:19:11
【问题描述】:

我需要帮助来 grep 从 OSGi MANIFEST.MF 文件中导出的包。 例如,来自以下文件:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: MyBundle
Bundle-SymbolicName: mybundle
Bundle-Version: 1.0.0
Import-Package: org.osgi.framework;version="1.6.0",
 org.osgi.util.tracker;version="1.3.1"
Export-Package: foo.bar.bla,
 foo.bar.blo,
 foo.bor.ble,
 foo.bor.bli
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Bundle-Activator: foo.bar.bla.Activator

我需要得到:

foo.bar.bla
foo.bar.blo
foo.bor.ble
foo.bor.bli

我们必须记住,最后一个包之后的以下标记可能是 Bundle-RequiredExecutionEnvironmen 或 Bundle-Activator 或任何其他。

编辑: 与:

cat MANIFEST.MF | awk '/Export-Package:(.*)/ {print $2; flag=1} flag=1 && /:/ {flag=0;next } flag=1 {print}' | sed 's/,//g'

我明白了:

 org.osgi.util.tracker;version="1.3.1"
foo.bar.bla
 foo.bar.blo
 foo.bor.ble
 foo.bor.bli

它不应该检索 org.osgi.util.tracker;version="1.3.1"

【问题讨论】:

  • 请告诉我们您的尝试
  • StackOverflow 是一个问答网站。你有什么想问的吗?
  • 问题是我该如何做我上面解释的事情。

标签: java bash grep osgi


【解决方案1】:

我建议您使用bnd

  • install bnd
  • 执行bnd select --header Export-Package my.jar

所有边缘情况都会为您处理。


对问题的“使用命令行”方面感兴趣的人的旧答案。

这不是 Grep 的工作,因为 grep 是逐行的,这是 awksed 的工作!

echo "Export-Package: foo.bar.bla,
    foo.bar.blo,
    foo.bor.ble,
    foo.bor.bli
    Bundle-RequiredExecutionEnvironment: JavaSE-1.8
" | cat MANIFEST.MF | awk '/Export-Package:(.*)/ {print $2; flag=1; next} flag && /:/ {flag=0;next} flag {print}' | sed 's/,//g'
  • /Export-Package:(.*)/ 找到“Export-Package”行并捕获“:”之后的内容。
  • {print $2; flag=1; next} 打印出捕获的组并将标志设置为真。跳过此行的其余规则
  • flag && /:/ 设置标志时,该行包含“:”
  • {flag=0;next } 将 flat 设置为 false 并跳过此行的其余规则
  • flag如果标志为真
  • {print} 打印该行。

但是这不包括诸如自动换行之类的边缘情况(感谢Neil Bartlett),虽然我们可以使 awk 程序更复杂,但当其他人创建应用程序来执行此操作时这是浪费时间(感谢@ 987654324@)。

【讨论】:

  • 不幸的是,不是因为根据 JAR 文件规范,MANIFEST.MF 的行必须以 72 个字节包装,并且它们在下一行以两个空格缩进继续。这可以拆分包名称。因此,必须对任何搜索工作进行编程以理解这种格式并将这些行重新组合在一起。
  • 我试图了解 awk 是如何工作的。上面命令的结果并不是我所需要的。
  • @mlk - 不是。问题是它还会返回 org.osgi.util.tracker;version="1.3.1",它不是导出的包。
  • 我在问题的末尾添加了命令的结果。看看编辑。
  • 已更新。不包括@NeilBartlett 提到的情况
猜你喜欢
  • 2023-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
相关资源
最近更新 更多