更新:请记住正则表达式是我唯一的选择。
更新 2:实际上,我也可以使用基于 bash 的解决方案。
尝试用 perl 正则表达式中的逗号替换双引号之间的管道(可以多个)
例子
continuer|"First, Name"|123|12412|10/21/2020|"3|7"||Yes|No|No|
Expected output (3 and 7 are separated by a comma)
continuer|"First, Name"|123|12412|10/21/2020|"3,7"||Yes|No|No|
There may be more digits, it may not be just the two d\|d
. It could be "3|7|2"
and the correct output has to be "3,7,2"
for that one. I've tried the following
cat <filename> | perl -pi -e 's/"\d+\|[\|\d]+/\d+,[\|\d]+/g'
但它只是将实际的字符串 d+
等...
非常感谢您的帮助。型
最佳答案
如果它必须是一个正则表达式这里是一个更简单的
perl -wpe's/("[^"]+")/ $1 =~ s{\|}{,}gr /eg' file
不是防弹的,但它应该适用于显示的用例。†
解释。使用 /e
修饰符,替换端被评估为代码。在那里,正则表达式在 /r
下的 $1
上运行,因此原始 ($1
) 没有变化; $N
是只读的,因此我们无法更改 $1
,因此无法运行“正常”的 s///
它。使用此修饰符返回更改后的字符串,如果没有更改则返回原始字符串。正如订购的那样。
一旦测试足够好,添加 -i
以根据需要“就地”更改输入文件。
我必须补充一点,我认为至少这部分工作不能使用 CSV 解析器完成...
感谢 ikegami 的改进版本
perl -wpe's/"[^"]+"/ $& =~ tr{|}{,}r /eg' file
更简单,无需捕获,tr
更快
† 使用问题中的字符串进行测试,仅扩展到此
con|"F, N"|12|10/21|"3|7"||Yes|"2||4|12"|"a|b"|No|""|end|
关于正则表达式(或 bash),获取引号之间的管道(perl),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73449292/