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)字符。具体包括什么取决于“排序顺序”,其中由环境变量决定。0
9
LC_COLLATE
.
任何单个字符,因此 2..
表示“任意两个字符”。[a-zA-Z]
是一个字符列表,将匹配位于和 之间的字符(1),以及位于和之间的字符。同样,这意味着什么取决于整理顺序!a
z
A
Z
+
是“之前的一个或多个”$
一个锚点,将正则表达式的这个位置连接到行尾。因此,您的正则表达式旨在(1)匹配任何符合以下条件的行:
\n(1)对于它实际上可能做什么,请参见下文
\n一些笔记
\n在您的示例中,您使用不带引号的正则表达式。这意味着任何字符在传递给命令之前都可以由 shell 解释grep
。如果您的模式包含$
或通配字符(*
、?
和[...]
字符列表!),shell 可能会尝试执行变量扩展(从而替换正则表达式的部分内容)或将通配模式扩展为可能的多个文件名,以便最终您将拥有更多参数在您最初想要的命令行上。shell 特有的其他字符(>
、#
等;
)可能会导致更意外的行为。你应该使用
grep -E \'^[0-9]..[a-zA-Z]+$\' filename.txt\n
Run Code Online (Sandbox Code Playgroud)\n反而。-x
请注意,您可以通过使用该标志强制“整行”匹配来摆脱开始和结束锚点:
grep -x -E \'[0-9]..[a-zA-Z]+\' filename.txt\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n 归档时间: |
|
查看次数: |
5355 次 |
最近记录: |