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和匹配末尾的空格 ( )。这在这里永远不会发生,因为ls每行打印一个条目。请注意,ls与 不一样ls | command。当 的输出ls通过管道传输时,会激活该-1选项,导致ls每行仅打印一个条目。如果你删除这些,它将按预期工作\s

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

但是,这也会匹配您不想要的各种内容。该正则表达式根本不是您所需要的。使[ ]一个字符类。该表达式[tty]+相当于[ty]+并且将匹配一个或多个tor y。这意味着它将匹配t,or tttttttttttttttt, ortytytytytytytytytyt或这些字母中的一个或两个字母的任何其他组合。另外,括号在这里毫无意义,它们使捕获组但你没有使用它。你想要的是这样的:

$ 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

相关内容