我需要帮助来从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,或任何其他。
修改: 用:
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"
答案 0 :(得分:1)
我建议您使用bnd。
bnd select --header Export-Package my.jar
所有边缘案例都是为您处理的。
对于对#34;感兴趣的人使用命令行"这方面的问题。
这不是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 && /:/
设置标志后,该行包含":" {flag=0;next }
将单位设置为false并跳过此行的其余规则flag
如果标志为真{print}
打印出来。然而,这并不包括诸如自动换行的边缘情况(感谢Neil Bartlett),而我们可以使awk程序更复杂,这是浪费时间,而其他人创建了一个应用程序来做到这一点(谢谢BJ Hargrave)。