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
他の投稿で読んだように、それでも機能させることはできません。
一致しない理由は、文字列tty
の前と一致の終わりにある空白(\s
)を探しているためです。 ls
は1行に1つのエントリを出力するので、ここでは決して起こりません。 ls
はls | command
と同じではないことに注意してください。 ls
の出力がパイプされると、-1
オプションがアクティブになり、ls
は1行に1つのエントリのみを出力します。 \s
を削除するだけで、期待どおりに動作します。
ls /dev | grep -E '([tty]+[0-4])'
しかし、それはあなたが望まないあらゆる種類のものにもマッチします。その正規表現はあなたがまったく必要とするものではありません。 [ ]
は 文字クラス を作成します。式[tty]+
は[ty]+
と同等で、1つ以上のt
またはy
と一致します。つまり、t
、またはtttttttttttttttt
、tytytytytytytytytyt
、またはこれらの文字の一方または両方のその他の組み合わせと一致します。また、括弧はここでは意味がなく、 キャプチャグループ になりますが、使用していません。あなたが欲しいのはこれです:
$ 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
その正規表現は少し複雑すぎるようです。また、引用を使用する必要があります!
$ ls /dev | grep -E "tty[1-4]$"
tty1
tty2
tty3
tty4
ただし、必ずこれを読んでください: なぜ「ls」を解析しないのか(代わりに何をすべきか)