GREP+REGEX が期待どおりに動作しません。

GREP+REGEX が期待どおりに動作しません。

ls / devの出力を1〜4の間の数字で終わる「tty」と一致させようとしています。

だから:

tty5
tty4
tty2
tty6
tty1

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

tty4
tty2
tty1

正規表現

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

その仕事をする正規表現

私はこれを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

他の投稿から読んだように、まだ機能しません。

ベストアンサー1

\s一致しないのは、文字列()のtty前と末尾でスペースを探しているからです。ls1行に1つの項目が印刷されるため、ここではこれは発生しません。lsと同じではありませんのでご注意くださいls | command。このオプションは、出力がlsパイプで接続されたときに有効になり、1行に1つの項目のみを印刷します。これを削除すると、期待どおりに機能します。-1ls\s

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

しかし、これは望ましくないすべての種類のアイテムと一致します。この正規表現はまったく必要ではありません。[ ]~を作るキャラクタークラス。この式は1つ以上のものと同じ[tty]+で、一致します。つまり、、、または、またはこれらの文字の1つまたは2つの他の組み合わせと一致することを意味します。また、ここでは括弧は意味がありません。[ty]+tyttttttttttttttttttytytytytytytytytytキャプチャグループしかし、あなたはそれを使用しませんでした。あなたが望むものは次のとおりです。

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

私がどのように追加したかに注意してください$。したがって、式はttyその時のみ一致します。一つ行末まで($)までの数字(1、2、3、4のいずれか)です。

もちろん、安全な方法ですべての問題を避けることができます解析の危険性ls代わりにglobを使用してください。

$ 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

おすすめ記事