如何过滤文本文件中以大写字母开头并以正整数结尾的行,并在 linux 的命令行上使用正则表达式?

Posted

技术标签:

【中文标题】如何过滤文本文件中以大写字母开头并以正整数结尾的行,并在 linux 的命令行上使用正则表达式?【英文标题】:How do I filter lines in a text file that start with a capital letter and end with a positive integer with regex on the command line in linux? 【发布时间】:2022-01-22 12:07:16 【问题描述】:

我正在尝试在 linux 终端中将 Regex 与 grep 命令一起使用,以便过滤文本文件中以大写字母开头并以正整数结尾的行。有没有办法修改我的命令,以便它在一行中通过一次调用 grep 而不是两次来完成这一切?我正在为 linux 和 microsoft store ubuntu 使用 windows 子系统。

文本文件:

C line 1
c line 2
B line 3
d line 4
E line five

我开始工作的命令:

grep ^[A-Z] cap*| grep [0-9]$ cap*

输出

C line 1
B line 3

这可行,但我觉得正则表达式可以以某种方式组合,但是

grep ^[A-Z][0-9]$ 

不会产生与上述命令相同的结果。

【问题讨论】:

grep [0-9]* 没有意义,它匹配任何字符串。 grep ^[A-Z] cap*grep ^[A-Z] cap*| grep [0-9]* 一样,你可能是说 grep '^[A-Z].*[0-9]' cap* grep '^[A-Z].*[0-9]$' 应该可以工作 哇,谢谢。我编辑了这个问题,以使我的初衷对后代更清楚。你们提出的解决方案对我的目的非常有效!谢谢, 【参考方案1】:

你需要使用

grep '^[A-Z].*[0-9]$'
grep '^[[:upper:]].*[0-9]$'

请参阅online demo。正则表达式匹配:

^ - 字符串开头 [A-Z] / [[:upper:]] - 大写字母 .* - 任何零个或多个字符([^0-9]* 匹配零个或多个非数字字符) [0-9] - 一个数字。 $ - 字符串结束。

另外,如果要确保字符串末尾的数字之前没有-,则需要使用否定括号表达式,例如

grep -E '^[[:upper:]](.*[^-0-9])?[1-9][0-9]*$'

这里,POSIX ERE 正则表达式(由于-E 选项)匹配

^[[:upper:]] - 开头的大写字母,然后 (.*[^-0-9])? - 任何文本的可选出现,然后是除数字和 - 之外的任何字符 [1-9] - 非零数字 [0-9]* - 零个或多个数字 $ - 字符串结束。

【讨论】:

这将错误地匹配C line 1 X。您需要锚定到行尾。 @WilliamPursell 我更专注于增强最初的尝试而不是需求。可能,正则表达式应该以 [^-0-9][0-9][0-9]*$ 或类似结尾。 我认为这需要两个调整。首先,它不会匹配像“F6”这样的行,它只是一个字符和一个中间没有任何内容的数字。其次,它自己匹配数字“0”,并且发布者想要正整数。这对我有用:grep -E '^[[:upper:]](.*[^-0-9])?[1-9][0-9]*$' 如果这解决了您的问题,请考虑接受它。或者,您可以发布自己的答案并接受。接受答案通过将问题标记为已解决来帮助未来的访问者。另见help.【参考方案2】:

当您使用管道时,您希望第二个 grep 作用于标准输入,而不是作用于您最初 grep 的文件。

grep ^[A-Z] cap*| grep [0-9]$

但是,如果要排除负数,则需要扩展第二个正则表达式。无论如何,一个更好的解决方案可能是切换到 Awk:

awk '/^[A-Z]/ && /[0-9]$/ && $NF > 0' cap*

输出格式会与grep略有不同;如果要包含匹配文件的名称,则必须单独指定:

awk '/^[A-Z]/ && /[0-9]$/ && $NF > 0  print FILENAME ":" $0 ' cap*

正则表达式^[A-Z][0-9]$ 正好匹配两个字符,第一个必须是字母,第二个必须是数字。如果你想允许它们之间的任意文本,那就是^[A-Z].*[0-9]$(为了不那么随意,使用比.*更具体的东西,比如(.*[^-0-9])?,你需要grep -E作为括号和问号表示可选,或反斜杠前面的反斜杠表示您使用 POSIX grep 开箱即用的 BRE 正则表达式方言。

【讨论】:

以上是关于如何过滤文本文件中以大写字母开头并以正整数结尾的行,并在 linux 的命令行上使用正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

如何显示以某个字母开头和结尾的文件名?

匹配以 2 个字母开头并以 3 个字母结尾的正则表达式

统计和检索文件内容

12.12

提取以相同的两个字符开头并以数字字符结尾的文本

第三周