web-dev-qa-db-ja.com

GREP + REGEXが期待どおりに機能しない

Ls/devからの出力を取得して、1〜4の数字で終わる「tty」に一致させようとしています。

だからから:

tty5
tty4
tty2
tty6
tty1

一致する必要があります:

tty4
tty2
tty1

正規表現

"\s([tty]+[0-4])\s"

RegExr で動作します。

私はこれをgrepで使ってみました:

ls /dev | grep -E \s([tty]+[0-4])\s

ls /dev | grep -E \s([tty]\+\[0-4])\s

ls /dev | grep -Ex \s([tty]+[0-4])\s

ls /dev | grep -P \s([tty]+[0-4])\s

他の投稿で読んだように、それでも機能させることはできません。

8
Surister

一致しない理由は、文字列ttyの前と一致の終わりにある空白(\s)を探しているためです。 lsは1行に1つのエントリを出力するので、ここでは決して起こりません。 lsls | commandと同じではないことに注意してください。 lsの出力がパイプされると、-1オプションがアクティブになり、lsは1行に1つのエントリのみを出力します。 \sを削除するだけで、期待どおりに動作します。

ls /dev | grep -E '([tty]+[0-4])'

しかし、それはあなたが望まないあらゆる種類のものにもマッチします。その正規表現はあなたがまったく必要とするものではありません。 [ ]文字クラス を作成します。式[tty]+[ty]+と同等で、1つ以上のtまたはyと一致します。つまり、t、またはtttttttttttttttttytytytytytytytytyt、またはこれらの文字の一方または両方のその他の組み合わせと一致します。また、括弧はここでは意味がなく、 キャプチャグループ になりますが、使用していません。あなたが欲しいのはこれです:

$ ls /dev | grep '^tty[0-4]$'
tty0
tty1
tty2
tty3
tty4

そこに$を追加した方法に注意してください。そのため、式はttyに一致し、次にone数値に一致します。行の終わりまで、1、2、3、または4のいずれかです。 ($)。

もちろん、これをすべて行う 解析の危険ls を回避する安全な方法は、代わりにグロブを使用することです。

$ ls /dev/tty[0-4]
/dev/tty0  /dev/tty1  /dev/tty2  /dev/tty3  /dev/tty4

あるいは単に

$ echo /dev/tty[0-4]
/dev/tty0 /dev/tty1 /dev/tty2 /dev/tty3 /dev/tty4
31
terdon

その正規表現は少し複雑すぎるようです。また、引用を使用する必要があります!

$ ls /dev | grep -E "tty[1-4]$"
tty1
tty2
tty3
tty4

ただし、必ずこれを読んでください: なぜ「ls」を解析しないのか(代わりに何をすべきか)

7
Panki