Regex 为什么这两个sed命令得到不同的结果?

Regex 为什么这两个sed命令得到不同的结果?,regex,csv,sed,Regex,Csv,Sed,一个csv文件example.csv,它有 hello,world,wow this,is,amazing 我想获取第一列元素,在开始时我编写了一个sed命令,如: sed -n 's/\([^,]*\),*/\1/p' example.csv 输出: helloworld,now thisis,amazing hello this 然后,我将命令修改为以下内容并获得所需内容: sed -n 's/\([^,]*\).*/\1/p' example.csv 输出: helloworl

一个csv文件example.csv,它有

hello,world,wow
this,is,amazing
我想获取第一列元素,在开始时我编写了一个sed命令,如:

sed -n 's/\([^,]*\),*/\1/p' example.csv
输出:

helloworld,now
thisis,amazing
hello
this 
然后,我将命令修改为以下内容并获得所需内容:

sed -n 's/\([^,]*\).*/\1/p' example.csv
输出:

helloworld,now
thisis,amazing
hello
this 

command1我使用逗号(,),command2我用点(.)代替逗号,它的工作原理与预期一样,有人能解释sed是如何获得第一个输出的吗?背后的故事是什么?是因为点(.)还是因为替换组和返回引用?

在正则表达式上。(dot)是单个字符的占位符

在正则表达式上。(dot)是单个字符的占位符

这背后的原因是,模式仅与单词的第一部分匹配,即仅替换Hello部分。*部分接受任意数量的逗号,然后没有任何内容被设置为下一个,即没有其他内容与模式匹配。例如:

hello,,,,,,,,,,,,,,,,,,world
将被替换为

helloworld
一个很好的例子是

sed -n 's/\([^,]*\),*$/\1/p' example.csv
当且仅当所有逗号都在行尾并将对其进行修剪时,此操作才有效,例如

hello,,,,,,

希望这能让问题更清楚一点。

这背后的原因是模式只匹配单词的第一部分,即只替换Hello部分。*部分接受任意数量的逗号,然后没有任何内容被设置为下一个,即没有其他内容与模式匹配。例如:

hello,,,,,,,,,,,,,,,,,,world
将被替换为

helloworld
一个很好的例子是

sed -n 's/\([^,]*\),*$/\1/p' example.csv
当且仅当所有逗号都在行尾并将对其进行修剪时,此操作才有效,例如

hello,,,,,,
希望这能让问题更清楚一点。

在两个正则表达式中,
([^,]*)
将使用字符串的同一部分-第一个遇到的逗号前面的所有符号。显然,区别在于如何处理这些正则表达式的其余部分

在第一个中,它是
,*
-零个或多个逗号符号。显然,它可能消耗的只是 逗号本身-行的其余部分不包含在模式中

在第二个符号中,它是
*
——任何符号中的零个或多个。完全覆盖剩下的字符串并不是什么大意外,因为它没有什么可停的;任何都是,嗯,任何都是。)

在这两种情况下,字符串的模式覆盖部分都被捕获组的内容替换(正如我前面所说的,“第一个逗号之前的所有符号”),而正则表达式的其余部分覆盖的内容则被删除。因此,在第一种情况下,第一个逗号被删除,在第二种情况下,逗号和字符串的其余部分被删除。

在两个正则表达式中,
([^,]*)
将使用字符串的相同部分-第一个遇到的逗号之前的所有符号。显然,区别在于如何处理这些正则表达式的其余部分

在第一个中,它是
,*
-零个或多个逗号符号。显然,它可能消耗的只是 逗号本身-行的其余部分不包含在模式中

在第二个符号中,它是
*
——任何符号中的零个或多个。完全覆盖剩下的字符串并不是什么大意外,因为它没有什么可停的;任何都是,嗯,任何都是。)


在这两种情况下,字符串的模式覆盖部分都被捕获组的内容替换(正如我前面所说的,“第一个逗号之前的所有符号”),而正则表达式的其余部分覆盖的内容则被删除。因此,在第一种情况下,第一个逗号被删除,在第二种情况下,逗号和字符串的其余部分被删除。

如果您喜欢第一个单词,为什么不使用
awk

awk -F, '{print $1}' file
hello
this

使用带反向引用的
sed

sed -nr 's/([^,]*),.*/\1/p' file
hello
this
似乎要让它工作起来,你需要
*
,这样它就能得到整条线。

r
选项使您无需转义括号
\(

如果您喜欢第一个单词,为什么不使用
awk

awk -F, '{print $1}' file
hello
this

使用带反向引用的
sed

sed -nr 's/([^,]*),.*/\1/p' file
hello
this
似乎要让它工作起来,你需要
*
,这样它就能得到整条线。
r
选项使您无需转义括号
\(

我可以建议您不要使用
sed

cut -d, -f1 example.csv
就我个人而言,我是一个超级的
sed
粉丝,但是
cut
在这种情况下更合适。

我可以建议不要使用
sed

cut -d, -f1 example.csv

就个人而言,我是一个超级的
sed
粉丝,但是
cut
在这种情况下更合适。

意味着你需要用反斜杠
\.
来转义它,除非它在字符类
.]
中。意味着你需要用反斜杠
\.
来转义它,除非它在字符类
.]
。我可以建议
cut-d,-f1 example.csv
。我是一个超级
sed
粉丝,但这更容易用
cut
来实现。我可以建议
cut-d,-f1 example.csv
。我是超级
sed
粉丝,但这更容易用
cut
来实现。你可能误解了我的观点。问题中的第二个命令是正确的,我不想转义圆点(.),csv文件中没有圆点。你知道如果使用第一个命令,为什么替换分组匹配“helloworld,wow”而不是“hello”?你可能误解了我的意思。问题中的第二个命令是正确的,我不想转义圆点(.),csv文件中没有点。你知道为什么替换分组匹配“helloworld,哇”而不是“hello”吗如果使用第一个命令?谢谢,这非常有效。我希望任何人都能解释替换分组,为我解释为什么得到第一个输出。谢谢,这非常有效。我希望任何人都能解释替换分组,为我解释为什么得到第一个输出。这个答案非常有意义!这个答案非常有意义!