我正在尝试编写一个正则表达式,它将在CVS(昏迷分离值)文件中找到电话号码。
Catch是我只感兴趣的电话号码,在特定的专栏(作为一个只后,一定数量的昏迷)。贝娄,我有正则表达式,将这样做,它的工作良好的Javascript标准。
(?:^([^^]*\,){3}[^^]*)\d{3}-\d{3}-\d{4}我实际上是在使用Bash,使用sed,grep,但我甚至找不到grep和sed使用什么Regex标准?
这是样本文本。
注意,现在我使用'^‘而不是',’来分隔值,因为用户在值.中包含了comas )
这不是真正的数据,信息技术是为了保护人们的隐私
28434658^17 Three^2013-09-19T19:57:23Z^80 W 54th St, Penthouse & 4th Fl, NY, 10018s212-409-1641^^Mary Szyb 347-340-1918^2 x week Thur 2.5hrs & Sat 4 hrs
28937693^356 West 36th street^2013-09-19T18:17:57Z^356 West 36th street, suite 706sNew York New York 10018^null^null^on call:
29219313^333 rector pl^2013-10-07T17:11:36Z^333 Rector Place 248-469-5859^^Jose Hernandez^2 x week Wed & Fri
28854346^50 Can^2013-09-23T13:10:54Z^152 East 28th Street, 7th Floor, NY, 10018s917-932-3962s646-710-4170^155 W 24rd St 3rd FL^null^Swlvia Smith347-933-6630sIrena Brown 347-991-1346s5 x week Mon-Fri
28434698^4Eleven^2013-09-19T19:57:23Z^112 West 28th Street, 3th Fl,sNY, 10018s917-922-3862s646-710-4170^^null^null让我也澄清一件正确的产出是:
212-409-1641
248-469-5859
917-932-3962
646-710-4170
917-922-3862
646-710-4170因为这些是列4中唯一的电话号码
发布于 2014-05-30 20:10:19
我正在发布结束这项工作的regex:
([0-9]{3}-[0-9]{3}-[0-9]{4})(?=[^^]*(\^[^^]*){3}$)谢谢大家的帮助。
我想我从这个问题中得到的教训是,如果一个解决方案不起作用,试着从不同的角度工作,在这种情况下,从后面数列。
发布于 2014-05-30 17:57:25
以下内容应该适用于你。
grep -Po '(\d{3}-){2}\d{4}' file.csv更新:
在用逗号替换^之后,实际的数据。
28434658,17 Three,2013-09-19T19:57:23Z,80 W 54th St, Penthouse & 4th Fl, NY, 10018s212-409-1641,Mary Szyb 347-340-1918,2 x week Thur 2.5hrs & Sat 4 hrs
28937693,356 West 36th street,2013-09-19T18:17:57Z,356 West 36th street, suite 706sNew York New York 10018,null,null,on call:
29219313,333 rector pl,2013-10-07T17:11:36Z,333 Rector Place 248-469-5859,Jose Hernandez,2 x week Wed & Fri
28854346,50 Can,2013-09-23T13:10:54Z,152 East 28th Street, 7th Floor, NY, 10018s917-932-3962s646-710-4170,155 W24rd St 3rd FL,null,Swlvia Smith347-933-6630sIrena Brown 347-991-1346s5 x week Mon-Fri
28434698,4Eleven,2013-09-19T19:57:23Z,112 West 28th Street, 3th Fl,sNY, 10018s917-922-3862s646-710-4170,null,null你可以试试以下的方法。
perl -nle '@F = split(/,(?!s| )/, $_); print $1 while ($F[3] =~ /((\d{3}-){2}\d{4})/g)' file.csv输出
212-409-1641
248-469-5859
917-932-3962
646-710-4170
917-922-3862
646-710-4170发布于 2014-05-30 17:46:27
Grep可以在-P或-E中使用perl或posix标准。详见man。对于这种情况,我通常首先使用剪切来分隔字段,前提是所有字段都不包含列分隔符。
echo "a,b,c,123-555-1212,d,e,f" | cut -f 4 -d','或者从档案里,
while read line; do
c4=$(echo $line | cut -f 4 -d',')
done < /tmp/file.csv如果任何列都可以包含逗号,那么最好切换到ruby、python等中的CSV库。
更新:使用-d'^‘分隔列,您可以很容易地匹配您感兴趣的列,如上面所示,sed的棘手部分是提取电话号码,
f="80 W 54th St, Penthouse & 4th Fl, NY, 10018s212-409-1641"
echo $f | sed -r 's/(.*?)([0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$)/\2/'
212-409-1641并不是说您必须使用扩展的regex命令行参数(-r),而不能使用像\d{3}这样的regex文本。sed的文档可以在info页面中找到,但是它通常更容易在网络上实现grep。这是一个很好的教程:http://www.thegeekstuff.com/2009/10/unix-sed-tutorial-advanced-sed-substitution-examples/
https://stackoverflow.com/questions/23960356
复制相似问题