Regex 需要在一个文件中搜索和替换2次,最好能够迭代执行一次

Regex 需要在一个文件中搜索和替换2次,最好能够迭代执行一次,regex,replace,awk,sed,comma,Regex,Replace,Awk,Sed,Comma,这个问题的措辞很奇怪,对不起 因此,我有一个包含大量数据的CSV文件,但在某些地方,我没有数据,因此有一个“,”甚至“,”,有两个或更多连续的空数据段,例如“,,,,” 现在,我需要在每个逗号之间加些东西。我可以轻松地搜索并替换为sed: sed s/,,/,-,/g < testfile sed s/,/,-,/g

这个问题的措辞很奇怪,对不起

因此,我有一个包含大量数据的CSV文件,但在某些地方,我没有数据,因此有一个“,”甚至“,”,有两个或更多连续的空数据段,例如“,,,,”

现在,我需要在每个逗号之间加些东西。我可以轻松地搜索并替换为sed:

sed s/,,/,-,/g < testfile
sed s/,/,-,/g
问题是2+个连续的空值迫使我运行两次sed来替换所有内容,因为在第一次传递时“,,”会变成“,-,,”,在第二次传递时只会变成“,-,-,”


请注意,2次通过将正确转换整个秋季的所有空条目。然而,我不喜欢这样,因为它感觉笨重。有没有一种方法可以用一个命令完成我的所有替换?

如果您想给
perl
一个机会,那么您可以使用前瞻功能并使用:

perl -pe 's/,(?=,)/,-/g' file
或者,您可以使用
awk

echo ",,," | awk 'BEGIN{FS=OFS=","} {for (i=2; i<NF; i++) if ($i=="") $i="-"} 1'
,-,-,

echo“,,”|awk'BEGIN{FS=OFS=“,”}{for(i=2;i如果您想给
perl
一个机会,那么您可以使用前瞻功能并使用:

perl -pe 's/,(?=,)/,-/g' file
或者,您可以使用
awk

echo ",,," | awk 'BEGIN{FS=OFS=","} {for (i=2; i<NF; i++) if ($i=="") $i="-"} 1'
,-,-,

echo“,”|awk'BEGIN{FS=OFS=“,”}{for(i=2;i您可以让sed循环,直到不再需要:

sed ':a;s/,,/,-,/g;ta'
说明:

  • :a
    -创建标签
  • s//
    -执行所需的替换
  • ta
    -如果自读取最后一个输入行和最后一个t或t命令以来,s///已成功执行替换,则分支到标签;如果省略标签,则分支到脚本末尾

因此,脚本将在每一行上循环,直到
不再匹配。

您可以让sed循环,直到不再需要:

sed ':a;s/,,/,-,/g;ta'
说明:

  • :a
    -创建标签
  • s//
    -执行所需的替换
  • ta
    -如果自读取最后一个输入行和最后一个t或t命令以来,s///已成功执行替换,则分支到标签;如果省略标签,则分支到脚本末尾
因此,脚本将在每一行上循环,直到
不再匹配。

尝试以下操作:

sed 's/,,/,-,/g;s/,,/,-,/g' file
试试这个:

sed 's/,,/,-,/g;s/,,/,-,/g' file
gsub()
返回每次调用时进行的替换次数,因此当该数字为零时,封闭while循环终止。因此,在这种情况下,它将循环不超过2次


gsub()
返回每次调用时进行的替换次数,因此当该数字为零时,封闭的while循环终止。因此,在这种情况下,它将循环不超过2次。

awk脚本无法正常工作。它无法正确保留内部字段。它需要
if(!$i)
已添加。该awk脚本无法正常工作。它无法正确保留内部字段。如果(!$i)
已添加,则需要