Regex 尝试使用反向引用查找并替换为sed,输出不是期望的结果
我试图使用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
,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;不幸的是,没有一个答案那里的答案实际上解释了问题。我会看看是否能找到更好的副本。