【问题标题】:Regular expression to remove commas after the first正则表达式在第一个之后删除逗号
【发布时间】:2015-07-26 19:48:52
【问题描述】:

我有一个看起来像这样的文件:

16262|John, Doe|John|Doe|JD|etc...

我需要查找并替换案例为:

16262|John, Doe, Dae|John|Doe Dae|JD|etc...

通过

16262|John, Doe Dae|John|Doe Dae|JD|etc...

总而言之,我想在第二个字段中更改第一个字段之后的逗号(之后可能不止一个)。

有什么建议吗?

【问题讨论】:

  • 你使用什么语言?
  • 我尝试过这样的事情,但只找到第二个逗号,我想做同样的事情,但所有可能出现的情况:(\w, [A-Z]\w+,)
  • 是linux,所以,bash,awk,sed,perl,欢迎提出建议。

标签: regex


【解决方案1】:

使用 gnu sed:

BRE 语法:

sed 's/\(\(^\||\)[^|,]*,\) \?\|, \?/\1 /g;'

ERE 语法:

sed -r 's/((^|\|)[^|,]*,) ?|, ?/\1 /g;'

详情:

(          # group 1: all the begining of an item until the first comma
    (      # group 2:
        ^  # start of the line
      |    # OR
        \| # delimiter
    )
    [^|,]* # start of the item until | or ,
    ,      # the first comma
)          # close the capture group 1
[ ]?       # optional space
|        # OR  
,          # an other comma
[ ]?

当第一个分支成功时,第一个逗号被捕获在组 1 中,所有开头的项目,因为替换字符串包含对捕获组 1 的引用 (\1),所以第一个逗号保持不变。

当第二个分支成功时,组 1 未定义,替换字符串中的引用 \1 为空字符串。这就是删除其他逗号的原因。

【讨论】:

  • 看起来很不错,谢谢。我如何在超过 230 万行的文本文件中高效地运行它?
  • @chango:sed 是一个流编辑器,因此,它可以处理任何大小的文件。但是,我建议您在使用大块之前进行一些测试,看看会发生什么。原地处理文件:sed -i.bak 's/...../g' file.txt.bak是备份原文件的扩展名,确定后可以删除)
  • @chango:为我工作,将其粘贴到您的终端上:echo '8202|John, Doe, Antonio|Doe Antonio|John|' | sed -r 's/((^|\|)[^|,]*,) ?|, ?/\1 /g;'(最终将 -r 替换为 -E 或测试 BRE 版本)
  • 太棒了,谢谢,osx 中的 sed 是 bsd 并且没有 -r。我在 linux 中尝试过,效果很好!
【解决方案2】:

这在很大程度上取决于语言。如果你有lookbehind,你可以使用正则表达式(?<=,.*),来做到这一点。如果你没有,例如在 JavaScript 中,如果你可以反转字符串,你可能仍然可以使用前瞻:

String.prototype.reverse = function () {
    return this.split("").reverse().join("");
};
"a, b, c, d".reverse().replace(/,(?=.*,)/g, '').reverse()
// yields "a, b c d"

我认为没有其他功能与正则表达式中的环视很相似,可以轻松模拟它们。可能您可以使用更强大的语言来捕获第一个逗号的索引,替换所有逗号,然后重新插入第一个逗号。

【讨论】:

  • 感谢您的建议,我会检查,
  • 您建议如何在一个非常大的文本文件中进行转换?超过 230 万行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多