【问题标题】:removing a whitespace between two specific words删除两个特定单词之间的空格
【发布时间】:2014-07-30 11:29:38
【问题描述】:

我正在处理一些已转录成 txt 文件的人口普查数据。但是,这些字段由空格而不是逗号或制表符分隔。以下是典型行中的一些字段,这将有助于说明我的问题:

18A 1   239 18A Coffey Street     165    125 331 McLocklan      Donald     New York

有些字段由多个空格分隔,但有些字段仅由一个空格分隔。然而,一些字段中包含多个单词(例如:New York),也由一个空格分隔。

我想我知道如何通过区分小写字母和大写字母之间的单个空格与两个大写字母之间的单个空格来做到这一点。我仍然是正则表达式的新手,但不知道如何做到这一点。谁能告诉我如何表达希望替换以小写字母结尾的单词/字符组和以带下划线的大写字母开头的单词/字符组之间的单个空格?

我认为这可以让我对 Coffey_Street 和 New_York 等内容进行分组,而无需连接 18A_Coffey 等字段。任何建议或意见都将受到欢迎。谢谢!

-康纳

【问题讨论】:

  • 嗯...这些字段实际上是固定宽度而不是分隔的吗?
  • 从这个 CSV 文件的间距来看,您正在使用固定宽度的转储,就像@AndrewMorton 所问的那样。您可以通过显示更多的输出行(3-4 行应该没问题)轻松判断这一点,因为我们可以快速直观地评估是否是这种情况。在这种情况下,正则表达式可以变得更简单,减少导致格式问题的边缘情况。
  • 您好,感谢您的回复。我认为它们是固定宽度的。这些是来自人口普查转录网站的文本文件:us-census.org/pub/usgenweb/census/ny/kings/1910/… 我在 Text Wrangler 工作,并遵照 Dan Nguyen 的 The Bastard's Book of Regular Expressions (regex.bastardsbook.com) 的说明。但是,出于某种原因,一些应该以某种方式工作的表达式,只是有点不是。我也在 Regexr.com 和 Rubular.com 上玩,结果相似。

标签: regex uppercase lowercase removing-whitespace


【解决方案1】:

我会要求向您发送文件的人再次发送文件,并使用更好的分隔符。在小写字母和大写字母之间添加下划线并非在所有情况下都有效。

也就是说,你可以用这个命令来完成它。

sed -r 's/([a-z]) ([A-Z])/\1_\2/g' file

解释

([a-z]) - match a lowercase character and group it
([A-Z]) - match an uppercase character and group it
the space in between - matches a space character

sed 找到与该模式匹配时,它会像这样替换它

\1 - puts back the lowercase character
_ - puts an _ where the space was
\2 - puts back the uppercase character

【讨论】:

  • +1,但我们知道他在使用 sed 吗?.. 也许他不知道他可以在许多正则表达式环境中做到这一点(@OP 看看替换 online demo
  • 谢谢!我来看看演示。老实说,我什至不知道我是否在使用 sed。正如我上面提到的,我只是在自学,有点摸索,看看什么是有效的。我一直认为这是学习某些东西的最佳方式——但我真的很感谢这样的论坛,因为当我遇到一些我无法弄清楚的事情时!感谢您的帮助!