正则表达式(或 bash),获取引号之间的管道(perl)

标签 regex bash perl awk tr

更新:请记住正则表达式是我唯一的选择。

更新 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/

相关文章:

linux - 在 Bash 中用嵌套括号替换文本的第一个实例的最佳方法?

perl - 如何将大量数据保存到Excel文件中?

perl - 如何更改哈希键的大小写?

java - 使用 System() 从 Perl 调用 Java .jar 程序

python - 优化长表达式列表的正则表达式匹配

c++ - 如何将简单的类似 Lisp 的代码拆分为 C++ 中的标记?

c - C 程序没有得到预期的错误输出

linux - 循环脚本,重定向到文件

regex - 在R中的其他两个字符串之间提取一个字符串

regex - Visual Studio代码: regex expression starts with but not ends with