1

我想要一行中的模式后的一对数字,模式是'mt ='并且它的位置在行中是可变的,所以如果我有mt = 83,我只想要83。我有下一个代码示例该行:

LINE=(10)un=5518666915/(34)ni=vvaummas03.me/ty=12/it=4/et=13/(8)id=ead57a5c/pt=7/to=20130408T155959Z/ot=2/(15)ed=ChangedGreeting/(16)ms=session_11218671/mt=81/

echo "$(expr substr $LINE $(($(echo $LINE | grep -b -o 'mt=' | cut -d: -f1)+4)) 2)"

我知道该指令可以改进,但它在 CentOS、Cygwin 和 OpenSUSE 中对我有用,但是当我在 Solaris 中运行它时,终端显示 grep 选项 -o 和 -f1 指令无效。我也遇到了指令 awk 和其他选项(如 -c with cut)的问题;它非常有限,所以我正在寻找 Solaris 上的常用命令。我不允许在系统上更改或安装任何东西。

有什么建议么?

4

2 回答 2

1

由于您只有一组有限的选项,因此可以仅使用带有正则表达式匹配的 Bash 3 或更新版本来执行此操作:

if [[ "$LINE" =~ ^.*mt=([0-9]+).*$ ]]; then
    printf "%s\n" "${BASH_REMATCH[1]}"
fi

这将捕获任何具有至少一位数字的数字,遵循mt=字符串中的模式。

于 2013-06-04T15:34:58.310 回答
0

这个怎么样:

~]$ LINE="(10)un=5518666915/(34)ni=vvaummas03.me/ty=12/it=4/et=13/(8)id=ead57a5c/pt=7/to=20130408T155959Z/ot=2/(15)ed=ChangedGreeting/(16)ms=session_11218671/mt=81/"
~]$ echo $LINE | sed -e "s/.*mt=\([0-9]\+\).*/\1/"
81
于 2013-06-04T15:22:19.297 回答