android - 简洁的多行子串提取

标签 android perl

好吧,我知道一些 shell 魔法,但我的头脑在一天中的这个时候无法解析所需的 sed 复杂性,所以我尝试了 perl。现在哈哈,多变的空间爆炸……但我还是以某种方式绕过了它,只花了我一个小时。 S0Oo。滥用我的 REPL shell 尝试从 android 安装包列表中提取名称和版本..

dumpsys package packages > dump
( set -xv; while perl -ne "$(rlwrap cat)" < dump; do eval printf "=%.s" {1..$(tput cols)}; echo; done; )

我认为这是可行的:

 dumpsys package packages|perl -ne 'if (/Package \[(.*)\]/g) {print "$1 -- "}; if (/versionName=(.*)/g) {print "$1\n"}'|sort

如何缩短这个时间? dumpsys 输出如下所示:

  Package [org.fdroid.fdroid.privileged] (64fb46e0):
    userId=10022 gids=[]
    pkg=Package{6501d0a8 org.fdroid.fdroid.privileged}
    codePath=/system/priv-app/FDroidPrivileged.apk
    resourcePath=/system/priv-app/FDroidPrivileged.apk
    nativeLibraryPath=/data/app-lib/FDroidPrivileged
    versionCode=1050 targetSdk=22
    versionName=0.1
    applicationInfo=ApplicationInfo{64f94838 org.fdroid.fdroid.privileged}
    flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ]
    dataDir=null
    supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
    timeStamp=2016-02-25 08:36:51
    firstInstallTime=2016-02-25 08:36:51
    lastUpdateTime=2016-02-25 08:36:51
    signatures=PackageSignatures{64fb4818 []}
    permissionsFixed=false haveGids=false installStatus=1
    pkgFlags=[ SYSTEM PRIVILEGED ]
    User 0:  installed=true blocked=false stopped=false notLaunched=false enabled=0
    grantedPermissions:
      android.permission.INSTALL_PACKAGES
      android.permission.DELETE_PACKAGES
  Package [ds.cpuoverlay] (64f98b70):
    userId=10048 gids=[3003, 1028, 1015, 1023]
    pkg=Package{64fd32a8 ds.cpuoverlay}
    codePath=/data/app/ds.cpuoverlay-1.apk
    resourcePath=/data/app/ds.cpuoverlay-1.apk
    nativeLibraryPath=/data/app-lib/ds.cpuoverlay-1
    versionCode=83 targetSdk=22
    versionName=5.7.0
    applicationInfo=ApplicationInfo{6514bcb0 ds.cpuoverlay}
    flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
    dataDir=/data/data/ds.cpuoverlay
    supportsScreens=[small, medium, large, xlarge, resizeable, anyDensity]
    timeStamp=2017-06-21 10:19:53
    firstInstallTime=2017-02-05 17:28:29
    lastUpdateTime=2017-06-21 10:19:55
    signatures=PackageSignatures{64f98c38 [64f999e8]}
    permissionsFixed=true haveGids=true installStatus=1
    pkgFlags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
    User 0:  installed=true blocked=false stopped=false notLaunched=false enabled=0
    ....

最佳答案

长短语确实需要两个匹配项,但可以稍微简化(和缩短)

dumpsys package packages | perl -nE'
    /^\s*Package \[(.*)\]/ && print "$1 -- "; /^\s*versionName=(.*)/ && say $1
' | sort

有输出

ds.cpuoverlay -- 5.7.0
org.fdroid.fdroid.privileged -- 0.1

我在一个文本文件中测试了你发布的输入,我将其输入 perl -nE '...' input.txt |排序

关于android - 简洁的多行子串提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45158296/

相关文章:

perl - 关于与 Mojolicious 或 HTML::Entities 一起使用的 Umlaut 的 Git::Repository 问题

Perl - 字符串中正则表达式匹配的位置

android - WebViewClient onReceivedError 已弃用,新版本未检测到所有错误

javascript - 指针事件 : Detect touching "through" an element

从 ssh 运行后,android 模拟器不会在 ubuntu 12.04 上启动

perl - 使用 perlbrew 时如何安装 CPAN 模块?

java - Intent权限和JobIntentService

android - 显示 DialogFragment 导致 IllegalStateException

perl - 返回所有具有最大值的哈希键/值对

perl - 使用 prepare 和 execute 避免 SQL 注入(inject)