我试图从 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]+
并且将匹配一个或多个t
or 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