如何在 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?

我试图在 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 '^[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]* - 零个或多个数字
  • $ - 字符串结尾。

当您使用管道时,您希望第二个 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 ":" [=12=] }' cap*

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