Bash 在文件的每一行中查找邮政编码

Bash 在文件的每一行中查找邮政编码,bash,shell,Bash,Shell,我有一个文件,文件的每一行都由一些文本和邮政编码组成,格式为12345或23456-2345。我需要从每一行提取这些Zipcode。我该怎么做呢 线条可能是这样的 123 Some street, Zipcode, IL, USA 2ND AVE STE 4000,SEATTLE,98104-1075,USA 任何建议在不知道邮政编码可能出现的所有不同方式的情况下,我选择了一些约束条件 邮政编码将始终有5位数字,并且可以选择在其后有一个带任意数字的“-” 邮政编码后面总是跟有任意数量的空格和逗

我有一个文件,文件的每一行都由一些文本和邮政编码组成,格式为12345或23456-2345。我需要从每一行提取这些Zipcode。我该怎么做呢

线条可能是这样的

123 Some street, Zipcode, IL, USA
2ND AVE STE 4000,SEATTLE,98104-1075,USA

任何建议

在不知道邮政编码可能出现的所有不同方式的情况下,我选择了一些约束条件

  • 邮政编码将始终有5位数字,并且可以选择在其后有一个带任意数字的“-”
  • 邮政编码后面总是跟有任意数量的空格和逗号
  • 假设所有地址都在“ADDRS.txt”中

    grep -oE '[0-9]{5}(-[0-9]*)?[ ]*,' ADDRS.txt | sed 's/,$//'
    

    我们在结尾使用sed来截断每个grep匹配中的逗号。

    对于这样一个定义不好的问题,以及定义不好的文件格式,我认为您无法找到比“查找任意五位数字字段,可选后缀为破折号和四位数字”更精确的方法

    这将查找两个逗号之间的表达式,然后修剪逗号

    perl -ne 'm/(?:,)(\d{5}(?:-\d{4})?)(?:,)/ and say $1' file
    
    在使用反向引用的单个进程中执行大致相同的操作。由于使用单个进程,它可能会更快,或者由于该进程的大小而更慢(对于小的输入文件可能更糟?)


    如果您确实需要允许字段可选地包含前导和/或尾随空格,那么修改正则表达式应该很简单。

    是这样吗,美国州可以在邮政编码之后?这会让事情变得复杂一点,这并不常见。邮政编码真的可以是字母Z,i,p,c,o,d,e吗?我想我知道你的意思,但这有助于确定。这是仅有的两种可能的格式,还是Zipcode可以位于字符串中的任何位置?@minoppret。拉链只是数字。@yu_ominae。它们通常是最后一列中的第二列,但有时也可能是任意一列。我想您必须拆分字符串,去掉空格,然后检查每个字段中是否只有数字或数字与一个
    -
    字符的组合。很抱歉,我没有编写shell脚本,所以我无法将脚本和示例组合在一起……如果任何字段以五位或更多数字结尾,这将抛出一个假阳性。例如,如果“STE 4000”多了一个数字,它就会匹配。是的,你是对的。只是没有足够明确的约束
    perl -ne 'm/(?:,)(\d{5}(?:-\d{4})?)(?:,)/ and say $1' file