Regex 尝试使用反向引用查找并替换为sed,输出不是期望的结果

Regex 尝试使用反向引用查找并替换为sed,输出不是期望的结果,regex,sed,Regex,Sed,我试图使用sed将文件中日期之前的双逗号替换为单逗号。期望的行为如下所示: 输入:,2020-01-01 输出:,2020-01-01 我的代码:sed's/,\(,[0-9]{4}-[0-9]{2}-[0-9]{2}\)/\1/g'stuff.csv>stuff 2.csv 但是,输出文件似乎没有改变。我做错了什么?{是语法的一部分,因此应该转义: sed 's/,\(,[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)/\1/g' stuff.csv > stuff2

我试图使用sed将文件中日期之前的双逗号替换为单逗号。期望的行为如下所示:

输入:
,2020-01-01

输出:
,2020-01-01

我的代码:
sed's/,\(,[0-9]{4}-[0-9]{2}-[0-9]{2}\)/\1/g'stuff.csv>stuff 2.csv


但是,输出文件似乎没有改变。我做错了什么?

{
是语法的一部分,因此应该转义:

sed 's/,\(,[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)/\1/g' stuff.csv > stuff2.csv
或者,如果您使用的是GNU sed,则可以使用
-r
选项并摆脱转义:

sed -r 's/,(,[0-9]{4}-[0-9]{2}-[0-9]{2})/\1/g' stuff.csv > stuff2.csv

您的正则表达式不工作的原因是您试图使用ERE正则表达式功能
{2}
,这是标准
sed
不支持的

如果您的
sed
支持POSIX BRE regex语法,请尝试

sed的/,\(,[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\})/\1/g'stuff.csv>stuff 2.csv
i、 e.反斜杠卷发就像你已经反斜杠圆括号一样

一些
sed
版本支持带有
-E
-r
的ERE正则表达式语法,但这是不可移植的。如果它在
sed
中工作,则圆括号前也不应该有反斜杠

regex方言太多,而且在不同的
sed
实现中对它们的支持也不尽相同,这是一个巨大的难题;有时候,生成可工作和可移植代码的最简单方法就是切换到不同的工具。讽刺的是,Perl根本不是标准的(并且完全有自己的regex方言,尽管它现在在大多数现代regex工具中基本上是事实上的标准)但它安装在大多数地方,并且在很长一段时间内保持稳定和向后兼容


为了记录在案,BRE是基本正则表达式语法的POSIX标准(大致上是原始
grep
支持的语法),ERE是扩展正则表达式语法,基于最初在
egrep
中引入的语法(现在POSIXly称为
grep-E
).

为什么不干脆
s/,*/,/g
sed
开箱即用不支持
{2}
;也许可以试试
\{2}
或查看您的
sed
是否支持非标准选项
-E
-r
。我不想替换所有双逗号,只替换前面的日期。谢谢您的评论,括号起了作用!询问Mac,但有几个答案实际上只是Linux;不幸的是,没有一个答案那里的答案实际上解释了问题。我会看看是否能找到更好的副本。