从 MANIFEST.MF 文件中 Grep Exported-Packages
Grep Exported-Packages from a MANIFEST.MF file
我需要帮助来 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 ; 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"
我建议您使用 bnd。
- install bnd
- 执行
bnd select --header Export-Package my.jar
所有边缘情况都为您处理。
对问题 "using the command line" 方面感兴趣的人的旧答案。
这不是 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 ; flag=1; next} flag && /:/ {flag=0;next} flag {print}' | sed 's/,//g'
/Export-Package:(.*)/
找到行 "Export-Package" 并捕获“:”之后的内容。
{print ; flag=1; next}
打印出捕获的组并将标志设置为真。跳过此行的其余规则
flag && /:/
设置标志时,且该行包含“:”
{flag=0;next }
将 flat 设置为 false 并跳过此行的其余规则
flag
如果标志为真
{print}
打印出该行。
然而,这不包括边缘情况,例如自动换行(感谢 Neil Bartlett), while we could make the awk program more complex this is a waste of time when someone else has created an application to do just that (thanks BJ Hargrave)。
我需要帮助来 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 ; 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"
我建议您使用 bnd。
- install bnd
- 执行
bnd select --header Export-Package my.jar
所有边缘情况都为您处理。
对问题 "using the command line" 方面感兴趣的人的旧答案。
这不是 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 ; flag=1; next} flag && /:/ {flag=0;next} flag {print}' | sed 's/,//g'
/Export-Package:(.*)/
找到行 "Export-Package" 并捕获“:”之后的内容。{print ; flag=1; next}
打印出捕获的组并将标志设置为真。跳过此行的其余规则flag && /:/
设置标志时,且该行包含“:”{flag=0;next }
将 flat 设置为 false 并跳过此行的其余规则flag
如果标志为真{print}
打印出该行。
然而,这不包括边缘情况,例如自动换行(感谢 Neil Bartlett), while we could make the awk program more complex this is a waste of time when someone else has created an application to do just that (thanks BJ Hargrave)。