gpt4 book ai didi

linux - 当定界符也出现在文件中任何位置的字段数据中时,如何替换定界符?

转载 作者:可可西里 更新时间:2023-11-01 11:45:29 25 4
gpt4 key购买 nike

我在 linux 中有输入文件的内容,类似

"test1",2,2,,0,"Sun,day",Jan
"be,st3",1,0,,0,"Sunday",Feb1
"nest",0,0,,0,"Sunday",Jul
"rest,5",,,,0,"Sunday",Aug

需要像这样的输出

test1|2|2||0|Sun,day|Jan
be,st3|1|0||0|Sunday|Feb1
nest|0|0||0|Sunday|Jul
rest,5||||0|Sunday|Aug

使用 tr 命令将 , 替换为 |它也取代了字段值。我无法理解如何只更改分隔符而不更改值。有人可以提供一些指示,我可以使用哪些命令来执行此任务?

最佳答案

使用 sed:

$ sed -E ':a; s/^(([^"]*("[^"]*")?)*),/\1|/; ta; s/"//g' file
test1|2|2||0|Sun,day|Jan
be,st3|1|0||0|Sunday|Feb1
nest|0|0||0|Sunday|Jul
rest,5||||0|Sunday|Aug

工作原理

如果 , 出现在偶数个 " 之后,这会将 , 更改为 |

  • :a

    这定义了一个标签a

  • s/^(([^"]*("[^"]*")?)*),/\1|/

    从行首 ^ 开始,查找以下任意数量的序列:

    1. `[^"]*`  = zero or more non-quotes

    2. `("[^"]*")?` = pairs of quotes
  • ta

    如果之前的 s 命令导致替换成功,则跳回到标签 a 并重试。

  • s/"//g

    在用竖线替换所有未引号的逗号后,我们删除引号。

简化

正如 potong 指出的那样,另一种更简单的解决方案是:

sed -E 's/(([^,"]*("[^"]*")*)*),/\1|/g;s/"//g' file

之所以可行,是因为有两个微妙之处:(1) sed 的正则表达式寻找最左边的最长匹配项,以及 (2) 在进行全局 (g) 替换时,不允许后续匹配项与先前匹配项重叠。牢记这两条规则,此命令仅在偶数个引号后将 , 替换为 |

关于linux - 当定界符也出现在文件中任何位置的字段数据中时,如何替换定界符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39500262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com