linux - 在用双引号替换定界符时处理数据

标签 linux unix awk sed

<分区>

我试图从双引号中删除竖线定界符,它替换为以下代码,但它不处理空字段和数字字段。任何帮助将不胜感激。

代码:

 sed 's/|*\([^"]\)/\1/g;s/\([^"]\),*/\1/g' test.csv

输入:

"Southern|Palms"|"AA|None"|"4"|"Kenya"|"MBA"|"Ken|Coast"|"Y"|1/11/2019 00:00:00|30/4/2020 00:00:00|"TH"||40.00|"HB|AI"||||||"Y"||||

输出:

"SouthernPalms"|"AANone"|"4"|"Kenya"|"MBA"|"KenCoast"|"Y"1/11/2019 00:00:0030/4/2020 00:00:00|"TH"40.00|"HBAI"|"Y"|

预期输出:

"Southern Palms"|"AA None"|"4"|"Kenya"|"MBA"|"Ken Coast"|"Y"|1/11/2019 00:00:00|30/4/2020 00:00:00|"TH"||40.00|"HB AI"||||||"Y"||||

最佳答案

sed -E 's/(^|[^"|])\|($|[^"|])/\1 \2/g' <file>

返回:

"Southern Palms"|"AA None"|"4"|"Kenya"|"MBA"|"Ken Coast"|"Y"|1/11/2019 00:00:00 30/4/2020 00:00:00|"TH"||40.00|"HB AI"||||||"Y"||||

它不适用于这样的行,我敢肯定还有许多其他示例可能会破坏正则表达式:

"Southern|Palms"|"AA|||None"|"4"|"Kenya"|"MBA"|"Ken|Coast"|"Y"|1/11/2019 00:00:00|30/4/2020 00:00:00|"TH"||40.00|"HB|AI"||||||"Y"||||

但是 awk/sed 不是使用 quotechar 和 escapechar 读取 csv 的合适工具。对于像这样的复杂文件,我会考虑使用 python 或任何将这些选项考虑在内的 CSV 阅读器。

关于linux - 在用双引号替换定界符时处理数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57149092/

相关文章:

c++ - 使用匿名 mmap() 检查实际分配的页面数

c - 关于整数内存分配

c - 如何循环通过标准输入和管道输出到 C 中的子 execl 命令?

c - 动态库加载 : easy way to figure out unresolved symbols runtime

regex - 仅当字符串尚不存在时才使用 sed 将字符串添加到行尾

regex - 使用 MAWK 时正则表达式与字符串不匹配

shell - 为什么我的 awk 子命令失败?

linux - 如何在 Linux 中向热敏打印机发送 ESC/POS 命令

linux - OpenWebmail 在收件箱中显示不正确的日期

c - 无限 while 循环中的信号