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