Regex 理解shell中的正则表达式
我在shell脚本中遇到了单分组的概念Regex 理解shell中的正则表达式,regex,shell,sed,Regex,Shell,Sed,我在shell脚本中遇到了单分组的概念 cat employee.txt 101,John Doe,CEO 我在练习SED替代命令时遇到了以下示例 sed 's/\([^,]*\).*/\1/g' employee.txt 上面的表达式与字符串匹配,直到第一个逗号 我无法理解这如何匹配第一个逗号 以下是我的理解 s - substitute command / delimiter \ escape character for ( ( opening braces for grouping
cat employee.txt
101,John Doe,CEO
我在练习SED替代命令时遇到了以下示例
sed 's/\([^,]*\).*/\1/g' employee.txt
上面的表达式与字符串匹配,直到第一个逗号
我无法理解这如何匹配第一个逗号
以下是我的理解
s - substitute command
/ delimiter
\ escape character for (
( opening braces for grouping
^ beginning of the line - anchor
[^,] - i am confused in this , is it negate of comma or mean something else?
为什么要使用
*
和*
来匹配字符串直到第一个逗号?^
匹配字符类之外的行的开头[]
。在字符类的开头,它表示否定
所以,它说:非逗号(
[^,]
)重复零次或多次(*
),后跟任何(.*)。字符串的匹配部分被逗号前的部分替换,因此它将删除从第一个逗号开始的所有内容。我知道要避免“仅链接”答案-Choroba正确地指出这是:
非逗号([^,])重复零次或多次(),后跟任何(.)。字符串中匹配的部分将替换为逗号之前的部分,因此它将删除从第一个逗号开始的所有内容
然而,我想补充一点,对于这类事情,我发现一个非常有用的工具,可以可视化正则表达式发生了什么
正则表达式的图像表示形式为:
给定字符串“foo,bar”s/\([^,]*\)./\1/g
,更具体地说,\([^,]\)*)
意味着“匹配任何非逗号的字符”(零次或多次)。因为“f”不是逗号,所以它与“f”匹配并“记住”它。因为它是“零次或多次”,所以它会再次尝试。下一个字符也不是逗号(它是o),然后,正则表达式引擎也将该o添加到组中。同样的事情也发生在第二个o
下一个字符实际上是逗号,但@choroba肯定禁止使用它。现在组中的是“foo”。然后,正则表达式使用组外的*
,该组导致零个或多个字符匹配但不被记住
在正则表达式的替换部分中,
\1
用于放置记忆文本(“foo”)的内容。匹配文本的其余部分将丢失,因此仅保留第一个逗号之前的文本。sed的/([^,]*)./\1/g'employee.txt以上是原始命令谢谢。再次感谢您共享此可视链接。它非常有用。您可能应该在字符类内部调整它,如果它是列出的第一个字符,并且^
不在字符类外部,则表示否定,而不是行的开头
,而不是字符串的开头,只是sed是面向行的,所以这两件事往往是相同的(尽管idk知道当你有所有的保持空间/模式缓冲区/波束向上时这是如何工作的,这是你在试图强迫sed同时处理多个输入行时听到的毫无意义的说法)。