Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Grep从MANIFEST.MF文件导出包_Java_Bash_Grep_Osgi - Fatal编程技术网

Java Grep从MANIFEST.MF文件导出包

Java Grep从MANIFEST.MF文件导出包,java,bash,grep,osgi,Java,Bash,Grep,Osgi,我需要帮助从OSGi MANIFEST.MF文件中grep导出的包。 例如,从以下文件: 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=

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

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,或任何其他标记

编辑: 与:

我得到:

 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”

我建议您使用

  • 执行
    bnd选择--header导出包my.jar
所有的边缘案件都由你处理


对“使用命令行”这一问题感兴趣的人的老答案

这不是Grep的工作,因为Grep是逐行排序的,这是awk或sed的工作

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}
    打印出捕获的组并将标志设置为true。跳过此行规则的其余部分
  • 标记&&/:/
    当设置了标记,且行中包含“:”
  • {flag=0;next}
    将平面设置为false,并跳过此行的其余规则
  • 标志
    如果标志为真
  • {print}
    打印该行

但是,这不包括诸如word wraps之类的边缘情况(谢谢),虽然我们可以使awk程序更复杂,但如果其他人已经创建了一个应用程序来实现这一点,这是浪费时间(谢谢)

一定要让我们知道您尝试了什么StackOverflow是一个问答网站。你想问一个问题吗?问题是我如何做我上面解释的。不幸的是,这不是因为根据JAR文件规范,MANIFEST.MF的行必须以72字节包装,并且它们在下一行以两个空格缩进继续。这可以拆分包名。因此,任何搜索工作都必须经过编程才能理解这种格式,并将这些行重新连接在一起。我试图了解awk是如何工作的。上面命令的结果不完全是我需要的。@mlk-不是。问题是它还将返回org.osgi.util.tracker;version=“1.3.1”,它不是导出的包。我已在问题的末尾添加了命令的结果。查看EDIT.Updated文件。不包括@NeilBartlett提到的案例
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'