什么表达式可以匹配 grep 命令中的模式 (^[0-9]..[a-zA-Z ]+$)?Linux bash

Dir*_*per -1 regular-expression

我试图了解正则表达式(^[0-9]..[a-zA-Z ]+$)grep命令中检测到的表达式(Linux 终端)

我知道如果我写以下命令:

grep ^[0-9]..[a-zA-Z] filename.txt
Run Code Online (Sandbox Code Playgroud)

我将检测任何包含表达式的行,例如92afg 但我不确定其+$含义以及我能够使用命令检测到哪种表达式

grep ^[0-9]..[a-zA-Z]+$ filename.txt
Run Code Online (Sandbox Code Playgroud)

我尝试打开一个新的文本文件,然后仅键入我认为会被检测到的表达式,但它们都不匹配,因此我希望对此进行解释。

Adm*_*Bee 7

让我们来分解一下。首先,请注意,此 RegExp 使用“扩展正则表达式”语法 (ERE) - 这是一个元字符,在默认使用的+“基本正则表达式”语法中不起作用(意味着它会匹配自身并需要该位置的grep文字+),因此如果您想将该正则表达式与 一起使用grep,则需要传递该-E选项。

\n
    \n
  • ^一个锚点,将正则表达式的这个位置与行的开头联系起来。
  • \n
  • [0-9]一个字符列表,将匹配属于和之间排序范围的任何单个(1)字符。具体包括什么取决于“排序顺序”,其中由环境变量决定。09LC_COLLATE
  • \n
  • 匹配.任何单个字符,因此 2..表示“任意两个字符”。
  • \n
  • 返回[a-zA-Z]是一个字符列表,将匹配位于和 之间的字符(1),以及位于和之间的字符。同样,这意味着什么取决于整理顺序!azAZ
  • \n
  • 意思+是“之前的一个或多个”
  • \n
  • $一个锚点,将正则表达式的这个位置连接到行尾。
  • \n
\n

因此,您的正则表达式旨在(1)匹配任何符合以下条件的行:

\n
    \n
  • 以任意数字开头
  • \n
  • 后跟任意两个字符
  • \n
  • 并且只包含字母(但至少一个)直到行尾。
  • \n
\n

(1)对于它实际上可能做什么,请参见下文

\n

一些笔记

\n
    \n
  1. 在您的示例中,您使用不带引号的正则表达式。这意味着任何字符在传递给命令之前都可以由 shell 解释grep。如果您的模式包含$或通配字符(*?[...]字符列表!),shell 可能会尝试执行变量扩展(从而替换正则表达式的部分内容)或将通配模式扩展为可能的多个文件名,以便最终您将拥有更多参数在您最初想要的命令行上。shell 特有的其他字符(>#;)可能会导致更意外的行为。你应该使用

    \n
    grep -E \'^[0-9]..[a-zA-Z]+$\' filename.txt\n
    Run Code Online (Sandbox Code Playgroud)\n

    反而。-x请注意,您可以通过使用该标志强制“整行”匹配来摆脱开始和结束锚点:

    \n
    grep -x -E \'[0-9]..[a-zA-Z]+\' filename.txt\n
    Run Code Online (Sandbox Code Playgroud)\n
  2. \n
  3. 包含范围(例如a-z)的字符列表很危险,因为它们可能不会提供您所想的内容。天真地人们可能期望它们匹配 ASCII 表中起始字符和结束字符之间的所有字符,但这仅适用于区域设置C。在其他语言环境中(特别是在通常设置的系统语言环境中,例如en_US.UTF-8),排序规则类似于这样,aAbB ... zZ因此a-z也会匹配大多数大写字母。此外,匹配实际上不是在单个字符的级别上,而是在“排序规则元素”级别上,这意味着在某些语言环境中,甚至几个字母的组合也可能匹配(例如dzs在匈牙利语中)!请参阅此答案(或者,一般来说,@St\xc3\xa9phane Chazelas 关于模式匹配的大多数答案)以获得更多见解。如果您想确保范围有效,请至少通过以下方式设置给定命令的排序规则

    \n
    LC_COLLATE="C" grep -E \' ... \' filename.txt\n
    Run Code Online (Sandbox Code Playgroud)\n
  4. \n
\n