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

これにより、文字列のパターンに従って、少なくとも 1 桁の数字がキャプチャ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 に答える