在CSV文件中连续替换空值

时间:2011-06-21 20:28:50

标签: regex perl sed

我有一行文字,如:

value,value,,,value,value

我希望用不同的值替换这两个空值。类似的东西:

value,value,hello,hello,value,value

我正在尝试类似的事情:

sed -e 's/^,/hello,/' -e 's/,$/,hello/' -e 's/,,/,hello,/g'

在开头,结尾和中间捕获空白值。但是,它不会连续捕获两个连续的空白值。如何更新正则表达式模式,以便在中间出现无限数量的连续空白值?

3 个答案:

答案 0 :(得分:4)

这个perl单行怎么样:

echo ',value,,,value,' | perl -pe 's/^(?=,)|(?<=,)(?=,|$)/hello/g'
# hello,value,hello,hello,value,hello

答案 1 :(得分:2)

我认为你不能用一个替换命令来做,因为Sed只替换你的模式的非重叠事件。这个丑陋的黑客可以工作,但要求你在你的价值观中阻止另外一个角色(我选择';'):

$ echo 'value,value,,,value,value' | sed -r 's/,/,;/g;s/(^|;)(,|$)/\1hello\2/g;s/,;/,/g'
value,value,hello,hello,value,value

答案 2 :(得分:1)

其他perl单行:

perl -we '$_=<>; while(s/,,/,hello,/) {}; print;'  value.txt

perl -we 'print join ",", map { $_ || 'hello' } split /,/, <>;' value.txt