正規表現はgrepでは使用できません。

正規表現はgrepでは使用できません。

私はこのような文字列を持っています

TEST="/dev/sda1 on /media/sda1 type vfat (rw,relatime,fmask=0000,dmask=0000,allow_utime=0022,codepage=cp437,iocharset=iso8859-1,quiet)"

(の結果mount | grep sda1

マウントポイントがどこにあるかをマッチさせたい。私の正規表現(ここから採用) はい

(?<=on[ \t])(.*)(?=[ \t]type)

しかし、何らかの理由で私のいくつかのツール(Busybox ash 1.14.2)では動作しません。

echo $TEST | grep -o -e '(?<=on[ \t])(.*)(?=[ \t]type)'

私には何の結果も与えませんでした。

echo $TEST | awk 'match($0, /(?<=on )(.*)(?= type)/){print $0}'

戻りエラーawk: bad regex '(?<=on[ ])(.*)(?=[ ]type)': Invalid preceding regular expression

expr match "$TEST" '\(?<=on[ \t]\)\(.*\)\(?=[ \t]type\)'

また、空の結果を返します。

ちょっとバカみたいな感じがします。

ベストアンサー1

LookaroundはPerl正規表現機能です。 GNU grepはこれを実装します(-Pオプションを使用して)。 busyboxコマンドが動作しているかどうかは言えません。

しかし、この場合は「on」の後に仕事を探しているだけです。 1つを選択してください

echo "$TEST" | awk '{for (i=1; i<=NF; i++) if ($i == "on") {print $(i+1); break}}'
echo "$TEST" | sed 's/.*on[[:blank:]]\(.*\)[[:blank:]]type.*/\1/'

おすすめ記事