如何从linux中的字符串中获取子字符串?

时间:2015-06-27 15:37:02

标签: linux awk sed

我正在尝试从linux中的字符串中提取特定字符串。

例如,我想从下面的字符串中提取“ android.content.pm.PackageParser.parseBaseApplication ”。

String具有常规格式,只有括号内的字符串可以更改。

Join point 'method-execution(boolean android.content.pm.PackageParser.parseBaseApplication(android.content.pm.PackageParser$Package, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, int, java.lang.String[]))' in Type

但是,我在找到合适的方法时遇到了麻烦。

起初,我尝试过sed命令,但它太复杂了,所以我无法完成工作。

你能推荐其他方法吗?

非常感谢。

3 个答案:

答案 0 :(得分:2)

如果感兴趣的字符串始终是第一个(之后的第二个字符串,那么:

echo "..." | awk -F '[()]' '{split($2,a," "); printf a[2]}'

提取它。

它使用分隔符()拆分该行。因此$2()之间的数据split$2拆分android.content.pm.PackageParser.parseBaseApplication ,你得到第二个字符串

#app

为你的例子。

答案 1 :(得分:1)

这看起来像AOP语法。因此,有了一定的假设,可以这样做:

echo "Join point...." | cut -d'(' -f2 | cut -d' ' -f2

说明:基于(剪切并获取第二个字段,这是除参数之外的方法签名。由于我们对返回类型也不感兴趣,因此基于空格拆分签名并获取第二个字段,即方法名称。

答案 2 :(得分:0)

这是基于您声明的不变量,您捕获的子字符串是唯一因文件而异的部分,这是一个perl解决方案:

Extract=$(perl -ne 'print $1 if /\s*Join point \x27method-execution\(boolean\s+([^(]*)/' file_to_search)
echo $Extract
android.content.pm.PackageParser.parseBaseApplication

我使用了完全导入,因为它减少了误报的可能性,但是如果你发现其他东西发生了变化并且想要使用它的子串(例如,"方法执行(boolean&#) 34;),这是你的选择。

这匹配变量子串开始的位置,它转到下一个不变量 - 开括号 - 所以我们可以捕获而不是打开括号。由于可能是某些人类交互改变了变体,因此我允许使用\ s +(一个或多个空格)来增加空格。

您可以使用与sed几乎相同的正则表达式,但需要使用整个字符串以避免它成为输出的一部分。例如,简写:

sed -r 's/.*LEAD_IN(CAPTURE_TEXT).*/\1/

LEAD_IN是常数领导者,"加入点......"和CAPTURE_TEXT相同的捕获组与perl解决方案中的捕获组相同。主要区别在于引导和转发"。*"消耗整个主题。