求助:使用grep和sed提取package:后至文件夹名的精准内容
解决方案:用grep+sed提取目标路径
针对你给出的文本,我们可以通过grep过滤目标行 + sed提取路径的组合,或者直接用sed一步完成,来得到你想要的结果。下面分两种方法讲解,方便你学习grep和sed的用法:
方法1:sed单命令完成
直接运行这条命令处理你的文本文件(假设文件名为packages.txt):
sed -n 's/^package:\(.*\)\/[^\/]*\.apk=.*/\1/p' packages.txt
命令解释:
-n:告诉sed只打印经过处理的匹配行,避免输出原文本中不需要的内容s/查找规则/替换内容/p:这是sed的替换命令,p表示打印替换后的结果^package::匹配行开头的package:,确保我们只处理符合格式的行\(.*\)\/:用\( \)捕获一个分组,.*是贪婪匹配,会从package:后面一直匹配到最后一个斜杠(因为贪婪模式会优先匹配最长的内容,所以会跳过前面所有的斜杠,直到最后一个)[^\/]*\.apk=:匹配最后一个斜杠后的文件名部分,[^\/]*表示"任意非斜杠的字符",也就是apk文件名,.apk=是固定后缀.*:匹配.apk=后面的包名内容\1:把整个匹配的内容替换成第一个捕获组的内容,也就是我们要的末尾无斜杠的文件夹路径
运行这条命令后,你会得到如下输出:
data/app/com.android.chrome-DeX_54== data/dataapp/ExactCalculator data/hw_init/cust/app/Email system/app/KeyChain system/delapp/WallpaperBackup system/framework system/priv-app/CIT vendor/app/NlpService
方法2:grep过滤 + sed提取
如果你想分开练习grep和sed的功能,可以先用grep过滤出符合格式的行,再用sed提取路径:
grep '^package:.*\.apk=' packages.txt | sed 's/^package:\(.*\)\/[^\/]*\.apk=.*/\1/'
分步解释:
- grep部分:
grep '^package:.*\.apk=' packages.txt^package::只匹配以package:开头的行.*\.apk=:确保行中包含.apk=,过滤掉不符合格式的行(比如示例中的package:system/framework/framework-res.apk=android其实也符合,会被保留)
- sed部分:和方法1中的sed命令逻辑完全一致,负责提取路径
额外:用grep单独提取(Perl正则模式)
如果你想尝试grep的高级用法,可以启用Perl兼容正则(-P选项),直接提取目标内容:
grep -oP '^package:\K.*(?=\/[^\/]*\.apk=)' packages.txt
命令解释:
-o:只输出匹配到的部分,而不是整行-P:启用Perl兼容正则,支持更多高级语法^package:\K:匹配package:,然后\K会忽略前面的内容,不输出.*(?=\/[^\/]*\.apk=):正向预查,匹配到"最后一个斜杠 + 文件名.apk="之前的所有内容,确保我们只提取到文件夹路径
这个命令的输出和前面两种方法完全一致,适合你扩展grep的知识。
内容的提问来源于stack exchange,提问作者Mujtaba
相关产品推荐
相关产品推荐

