Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 理解shell中的正则表达式_Regex_Shell_Sed - Fatal编程技术网

Regex 理解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

我在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 
^ 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同时处理多个输入行时听到的毫无意义的说法)。