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)
我尝试打开一个新的文本文件,然后仅键入我认为会被检测到的表达式,但它们都不匹配,因此我希望对此进行解释。
让我们来分解一下。首先,请注意,此 RegExp 使用“扩展正则表达式”语法 (ERE) - 这是一个元字符,在默认使用的+“基本正则表达式”语法中不起作用(意味着它会匹配自身并需要该位置的grep文字+),因此如果您想将该正则表达式与 一起使用grep,则需要传递该-E选项。
^一个锚点,将正则表达式的这个位置与行的开头联系起来。[0-9]一个字符列表,将匹配属于和之间排序范围的任何单个(1)字符。具体包括什么取决于“排序顺序”,其中由环境变量决定。09LC_COLLATE.任何单个字符,因此 2..表示“任意两个字符”。[a-zA-Z]是一个字符列表,将匹配位于和 之间的字符(1),以及位于和之间的字符。同样,这意味着什么取决于整理顺序!azAZ+是“之前的一个或多个”$一个锚点,将正则表达式的这个位置连接到行尾。因此,您的正则表达式旨在(1)匹配任何符合以下条件的行:
\n(1)对于它实际上可能做什么,请参见下文
\n一些笔记
\n在您的示例中,您使用不带引号的正则表达式。这意味着任何字符在传递给命令之前都可以由 shell 解释grep。如果您的模式包含$或通配字符(*、?和[...]字符列表!),shell 可能会尝试执行变量扩展(从而替换正则表达式的部分内容)或将通配模式扩展为可能的多个文件名,以便最终您将拥有更多参数在您最初想要的命令行上。shell 特有的其他字符(>、#等;)可能会导致更意外的行为。你应该使用
grep -E \'^[0-9]..[a-zA-Z]+$\' filename.txt\nRun Code Online (Sandbox Code Playgroud)\n反而。-x请注意,您可以通过使用该标志强制“整行”匹配来摆脱开始和结束锚点:
grep -x -E \'[0-9]..[a-zA-Z]+\' filename.txt\nRun Code Online (Sandbox Code Playgroud)\n包含范围(例如a-z)的字符列表很危险,因为它们可能不会提供您所想的内容。天真地人们可能期望它们匹配 ASCII 表中起始字符和结束字符之间的所有字符,但这仅适用于区域设置C。在其他语言环境中(特别是在通常设置的系统语言环境中,例如en_US.UTF-8),排序规则类似于这样,aAbB ... zZ因此a-z也会匹配大多数大写字母。此外,匹配实际上不是在单个字符的级别上,而是在“排序规则元素”级别上,这意味着在某些语言环境中,甚至几个字母的组合也可能匹配(例如dzs在匈牙利语中)!请参阅此答案(或者,一般来说,@St\xc3\xa9phane Chazelas 关于模式匹配的大多数答案)以获得更多见解。如果您想确保范围有效,请至少通过以下方式设置给定命令的排序规则
LC_COLLATE="C" grep -E \' ... \' filename.txt\nRun Code Online (Sandbox Code Playgroud)\n