2015-06-27 217 views
1

我想从Linux中的字符串中提取特定的字符串。如何从linux中的字符串获取子字符串?

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

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

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命令,但它太复杂了,所以我无法完成这项工作。

你能推荐其他方法吗?

非常感谢。

回答

1

这看起来像AOP语法。基于(切割并获得第二场,这是除了参数的方法签名:所以具有一定的假设,这是可以做到的:

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

解释。由于我们对返回类型也不感兴趣,因此根据空格分割签名并获取第二个字段,即方法名称。

2

如果有兴趣的字符串永远是第一位(再经过第二个字符串:

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

解压。

它使用分隔符()分隔线。所以$2之间的数据将会在()之间。 split分裂$2,你会得到第二个字符串是

android.content.pm.PackageParser.parseBaseApplication 

您的例子。

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 

我使用了完整的潜在客户,因为它减少了假阳性的可能性,但是如果你发现其他东西改变了,并且想要使用它的子串(例如,“方法执行(布尔)”,那么这是你的选择。到变量子字符串开始的位置,然后到下一个不变量 - 左括号 - 所以我们可以在不打开括号的情况下捕获它,因为它是可能的当某些人际交互改变变体时,我允许使用\ s +(一个或多个空格)来增加空格。

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

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

哪里LEAD_IN是恒定的领导者,“连接点......”和CAPTURE_TEXT同捕获组在perl的解决方案。主要区别在于引领和嘲讽“*”消耗整个主题。

相关问题