Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 使用grep查找一组数字之间的行_Unix_Grep - Fatal编程技术网

Unix 使用grep查找一组数字之间的行

Unix 使用grep查找一组数字之间的行,unix,grep,Unix,Grep,我正在为我的班做一个Unix作业,我遇到了一点问题。我们正在尝试输出数字在20-30之间的行 有没有一种方法可以使用grep或egrep,这样您就可以输出一行具有限制的数字,例如20到30之间的数字或小于25的数字?这应该可以做到: grep '\(^\|\D\)\(2[0-9]\|30\)\(\D\|$\)' input 或者,类似地: grep '\(^\|[^0-9]\)\(2[0-9]\|30\)\([^0-9]\|$\)' input 或使用-p标志: grep -P '(^|[^

我正在为我的班做一个Unix作业,我遇到了一点问题。我们正在尝试输出数字在20-30之间的行

有没有一种方法可以使用
grep
egrep
,这样您就可以输出一行具有限制的数字,例如20到30之间的数字或小于25的数字?

这应该可以做到:

grep '\(^\|\D\)\(2[0-9]\|30\)\(\D\|$\)' input
或者,类似地:

grep '\(^\|[^0-9]\)\(2[0-9]\|30\)\([^0-9]\|$\)' input
或使用
-p
标志:

grep -P '(^|[^0-9])(2[0-9]|30)([^0-9]|$)' input

因此,基本上,考虑您想要匹配的可能字符串,并将其表示为模式。

要对20-30之间的值进行grep,您可以使用此选项

egrep -e "[^0-9]2[0-9][^0-9]" -e "[^0-9]30[^0-9]" <file_name>
egrep-e“[^0-9]2[0-9][^0-9]”-e“[^0-9]30[^0-9]”

您可以将这个简单的grep与正则表达式一起使用

$-grep  -wE '(2[0-9]|30)' file_name

您可以尝试以下命令:

 grep -wE '\b[2]{1}[0-9]{1}\b|30' file
说明:

[2]{1} --> find a number starting with one 2
[0-9]{1} --> The "2" is follored by any number but only repeated once
|30 --> And also finds "30" number.

包容还是排斥?(20,30)或[20,30]?如何用正则表达式表示20-30?(a) 20到29是2后跟任意数字。(b) 30只是30。所以整个范围就是(a)或(b)。任何小于25的数字都将使用类似的构造块。这(regex
”(2[0-9]| 30)
)将拾取2001和其他各种数字。是的,这个表达式拾取2001到
20
01的值,我编辑了我的帖子。****谢谢你***。是的,GNU
grep
(和BSD
grep
,但不是POSIX)可以使用
-w
选项。这里实际上不需要括号,尽管它们也没有坏处。这(regex
2[0-9]
30
)将拾取2001和其他各种数字,除非当前目录中有一个名为
22
的文件,它将拾取22(正确)和222、122、221以及其他类似数字。总是用单引号将正则表达式括起来-为了理智起见。嗨。。。很好的观察。。如果更改了itAFAIK,则假定您有一个版本的
grep
,该版本支持Perl regex(PCRE),可在使用PCRE时自动检测。这可能不适用于“Unix”,这是问题的标记。GNU
grep
确实支持PCRE,至少有一个显式的
-P
。否则,这个答案是好的。它至少可以避免选择
200
120
以及其他包含两个以上数字的数字。@JonathanLeffler,由于某种原因,这对
-P
不正确,有什么想法吗?@JonathanLeffler,明白了,我不应该用
-P
逃避一些操作员。GNU
grep
试图自动成为所有人的一切,这使事情变得非常复杂。坦率地说,这没用。我喜欢使用
-P
启用PCRE的想法。我想你会发现:
grep-P'(^ |\D)(2\D | 30)(\D |$)
grep-E'(^ |[^0-9])(2[0-9]| 30)([^0-9]|$)
工作。