
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
前と末尾でスペースを探しているからです。ls
1行に1つの項目が印刷されるため、ここではこれは発生しません。ls
と同じではありませんのでご注意くださいls | command
。このオプションは、出力がls
パイプで接続されたときに有効になり、1行に1つの項目のみを印刷します。これを削除すると、期待どおりに機能します。-1
ls
\s
ls /dev | grep -E '([tty]+[0-4])'
しかし、これは望ましくないすべての種類のアイテムと一致します。この正規表現はまったく必要ではありません。[ ]
~を作るキャラクタークラス。この式は1つ以上のものと同じ[tty]+
で、一致します。つまり、、、または、またはこれらの文字の1つまたは2つの他の組み合わせと一致することを意味します。また、ここでは括弧は意味がありません。[ty]+
t
y
t
tttttttttttttttt
tytytytytytytytytyt
キャプチャグループしかし、あなたはそれを使用しませんでした。あなたが望むものは次のとおりです。
$ 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
答え2
この正規表現は少し複雑すぎるようです。また、引用符を使用する必要があります!
$ ls /dev | grep -E "tty[1-4]$"
tty1
tty2
tty3
tty4
ただし、次の内容を必ずお読みください。なぜ`ls`を解析しないのですか*(そしてどうすればいいですか?)
答え3
bash-4.2$ ls -l /dev | grep -o "tty[1-4]$"
tty1
tty2
tty3
tty4
bash-4.2$ ls -l /dev | awk '/tty[1-4]$/{print $NF}'
tty1
tty2
tty3
tty4
bash-4.2$ output=$(ls /dev); echo "${output}" | grep "tty[1-4]$"
tty1
tty2
tty3
tty4