sed - 使用正则表达式输出匹配字符串

sed - output match string with regex

我想通过正则表达式提取子串并输出匹配的组。

在下面的示例字符串中,预期输出是“package:”之后并以“.apk”结尾的字符串。下面的代码在开始部分有效,但结束部分无效。

echo "package:/data/app/~~6qMr1wvTvXFW_ceh1ptDHA==/com.sample.touch-tOazIbhNj63ME76BG6zrsA==/base.apk=com.sample.touch" |sed -E 's/package:([^ ]+apk)//'
/data/app/~~6qMr1wvTvXFW_ceh1ptDHA==/com.sample.touch-tOazIbhNj63ME76BG6zrsA==/base.apk=com.sample.touch

预期输出:

/data/app/~~6qMr1wvTvXFW_ceh1ptDHA==/com.sample.touch-tOazIbhNj63ME76BG6zrsA==/base.apk

您需要使用

sed -E 's/package:([^ ]+apk).*//'
# or
sed 's/package:\([^ ]*apk\).*//'

online demo:

#!/bin/bash
echo "package:/data/app/~~6qMr1wvTvXFW_ceh1ptDHA==/com.sample.touch-tOazIbhNj63ME76BG6zrsA==/base.apk=com.sample.touch" | \
sed -E 's/package:([^ ]+apk).*//'
# => /data/app/~~6qMr1wvTvXFW_ceh1ptDHA==/com.sample.touch-tOazIbhNj63ME76BG6zrsA==/base.apk

详情:

  • -E - POSIX ERE 语法已启用
  • package:([^ ]+apk).* - package: 字符串,然后是 space 以外的一个或多个字符,然后 apk 子字符串捕获到组 1 (([^ ]+apk)) ,然后是字符串的其余部分 (.*)
  • - 替换为第 1 组值。