sed 删除字符之前和之后的所有内容

sed 删除字符之前和之后的所有内容

我在android上运行这个

命令

dumpsys activity activities | grep mFocusedApp

输出

mFocusedApp=ActivityRecord{273535b u0 com.any.some/.app.AnyActivity t5595}

预期的

com.any.some

我只需要包名称 通过 sed 或其他直接命令


编辑(从评论复制到回答;添加是为了澄清结果字符串应作为参数传递给命令。)

我需要重新启动当前关注的应用程序,所以我的想法是在获取包名称后,我将通过am stop和停止它am start,例如:

am stop com.any.some && am start com.any.some

答案1

使用 GNU grep

focusApp=$(
  dumpsys activity activities |
    grep -Po '^mFocusedApp=\S+\{\S+ \S+ \K[^\s/]+'
)

标准:

focusApp=$(
  dumpsys activity activities |
    sed -n 's/^mFocusedApp=[^ ]\{1,\}{[^ ]\{1,\} [^ ]\{1,\} \([^\s/]+\).*/\1/p'
)

答案2

或许

dumpsys activity activities | grep '^mFocusedApp=' | sed 's#.* \([^ ]*\)/.*#\1#'

正则表达式匹配和之间的所有非空格字符/

测试用

echo 'mFocusedApp=ActivityRecord{273535b u0 com.any.some/.app.AnyActivity t5595}' |sed 's#.* \([^ ]*\)/.*#\1#'

输出:

com.any.some

(需要更多示例来检查这是否适合所有相关输入。)


回复评论:

要将包名称用于其他命令,您可以将输出保存在变量中,例如

package=$(dumpsys activity activities | grep '^mFocusedApp=' | sed 's#.* \([^ ]*\)/.*#\1#')
am stop "$package" && am start "$package"

答案3

你没有说为什么这应该是输出,但这里有 1 个猜测你可能想要什么:

dumpsys activity activities| awk -F'[ /]' '/^mFocusedApp=/{print $3}'
com.any.some

答案4

stdin=$(
  dumpsys activity activities |
    grep mFocusedApp |
    cut -d "{" -f2 |
    cut -d " " -f3 |
    cut -d "/" -f1
)
am force-stop "$stdin" && am start "$stdin"

唷,谢谢大家

相关内容