【发布时间】:2017-02-22 20:01:12
【问题描述】:
是否可以使用 sed/awk 匹配一行中模式的最后 k 次出现?
为简单起见,假设我只想匹配每行中的最后 3 个逗号,例如(请注意,这两行的总逗号数不同):
10, 5, "Sally went to the store, and then , 299, ABD, F, 10
10, 6, If this is the case, and also this happened, then, 299, A, F, 9
我只想匹配从299 开始直到行尾的逗号。
动机:我正在尝试将其中一个字段中带有杂散逗号的 CSV 文件转换为制表符分隔的文件。由于正确列的数量是固定的,我的想法是用制表符替换前几个逗号,直到麻烦的字段(这很简单),然后从行尾向后退以再次替换。这应该将所有正确的分隔符逗号转换为制表符,同时在有问题的字段中保持逗号完整。
可能有更聪明的方法可以做到这一点,但我认为无论如何这将是一个很好的 sed/awk 教学点。
【问题讨论】:
-
您应该在需要时在正确的位置添加双引号,而不是放置制表符(这有可能最终将问题转换为另一个问题)。
-
是的,这听起来像是一个经典的 XY 问题。修复生成无效 CSV 的代码。
-
绝对是 XY 问题。向我们展示您正在尝试做的事情,而不是您尝试如何做,否则您将被展示如何实施一个坏主意。
-
@glennjackman:我无法控制 CSV 的生成方式。数据集是公开的,它们只是带有这个问题。
-
@gogurt:这取决于它们是否被转义(使用其他双引号或反斜杠)。您应该将几个有问题的行(真实示例)添加到您的问题中,否则无法为您提供有用的答案。