web-dev-qa-db-ja.com

sedもgrepも使用せずにキャプチャグループを抽出できません

キーと値のペアの構文から値のペアを抽出したいのですが、できません。
私が試した例:

echo employee_id=1234 | sed 's/employee_id=\([0-9]+\)/\1/g'

しかし、これはemployee_id=1234および1234これは実際にはキャプチャグループです。

ここで何が間違っていますか?私も試しました:

echo employee_id=1234| egrep -o employee_id=([0-9]+)

しかし、成功していません。

41
Jim

1。egrep -o:を使用

echo 'employee_id=1234' | egrep -o '[0-9]+'
1234

2。grep -oP(PCRE)を使用:

echo 'employee_id=1234' | grep -oP 'employee_id=\K([0-9]+)'
1234

sed:を使用

echo 'employee_id=1234' | sed 's/^.*employee_id=\([0-9][0-9]*\).*$/\1/'
1234
82
anubhava

Anubhavaの回答番号2を展開するには、grepが返す一般的なパターンonlyは次のとおりです。

$ regex="$precedes_regex\K($capture_regex)(?=$follows_regex)"
$ echo $some_string | grep -oP "$regex"

そう

# matches and returns b
$ echo "abc" | grep -oP "a\K(b)(?=c)" 
b 
# no match
$ echo "abc" | grep -oP "z\K(b)(?=c)"
# no match
$ echo "abc" | grep -oP "a\K(b)(?=d)"
21
jayflo

awkを使用する

echo 'employee_id=1234' | awk -F= '{print $2}'
1234
6
Jotne

あなたは特にsedを求めていますが、何か他のものを使用する可能性がある場合-POSIX準拠のシェルは、フォーク/サブシェルを必要としないパラメーター拡張を行うことができます:

foo='employee_id=1234'
var=${foo%%=*}
value=${foo#*=}

$ echo "var=${var} value=${value}"
var=employee_id value=1234
4

拡張正規表現にsed -Eを使用

    echo employee_id=1234 | sed -E 's/employee_id=([0-9]+)/\1/g'
3
commander Ghost