正则表达式从电话号码中删除前导9,这不在行的开头

时间:2013-07-30 15:07:22

标签: regex vim

我有一个包含大约200个条目的文件,每个条目都与此相似:

001     907123456789  
002     907234567890  
003     907345678901  
004     907456789012  

我想从每个电话号码中删除前导9(即列表中的第二项)我正在努力寻找能够帮助我解决这种情况的任何事情,因为电话号码不是第一项线。

我刚注意到文件中的空格没有正确复制,前3位数快速拨号和电话号码之间有5个空格。

有关如何做到这一点的任何建议将不胜感激。

4 个答案:

答案 0 :(得分:3)

以下命令应该执行您想要的操作:

%s/^\d\{3} \zs9/

请注意,这仅适用于电话号码具有您提供的确切格式的情况。正则表达式是非常具体的,使它更不可能搞砸文件中的任何其他东西。


既然你说你遇到了麻烦,我会解释这个正则表达式中发生了什么,所以即使你不决定使用它,你至少可以学到一点。

%s表示“在每一行都进行替换”。这不是正则表达式的一部分。这是一个标准的vim命令。

^是一个锚点,意思是“这必须是行开头的位置” - 或者换句话说,“在行上的任何内容之前都没有任何内容。”

\d\{3}表示“此处必须有三位数”,表示该行的前三个字符必须为数字。

(空格)意味着接下来必须有一个文字空间。去图。

\zs表示“实际上在这里开始比赛。”之前的东西必须匹配,但不要“选择”之前的任何东西。

9表示接下来必须有文字9。这就是你要匹配的东西。

/,最后一个字符,意思是“接下来的一切就是你应该替换匹配的内容。”由于没有任何内容,它意味着“无需替换匹配”。

完成!

修改

显然,有问题的数据文件在第一组数字和第二组数字之间没有一个空格。为了解决这个问题,请更改影响空白区域匹配的正则表达式部分。

因此,正则表达式中的空格应替换为\s\+,意思是“匹配任何空白字符一次或多次”。所以,正则表达式将是:

%s/^\d\{3}\s\+\zs9/

答案 1 :(得分:0)

只需替换所有前面没有任何内容的空格。

's/ 9//g'

答案 2 :(得分:0)

我已经投票决定关闭你的问题了,因为你没有尝试提出自己的解决方案,你应该尝试,并展示你做了什么和什么不行。

首先创建一个匹配电话号码的正则表达式,这取决于文件中的数字类型,但例如:

001 9\(\d*\)

然后在替换中使用它。

如果不是所有数字都以001开头,那么请调整正则表达式以使用文件中的所有数字。

您可能会发现这不起作用,因为它错误地改变了行的错误部分,如:

001 1234001 99

在这种情况下,弄清楚如何优化正则表达式以匹配您想要匹配的内容(不要只是要求答案在盘子上交给你。)

答案 3 :(得分:0)

您可以使用s/^([0-9]+) 9/\1 /

测试:

echo -e "001 907987654321\n001 80798765 94321\n2345 9079876 954321" | \ 
sed 's/^\([0-9]\+\) 9/\1 /'

得到了输出:

001 07987654321
001 80798765 94321
2345 079876 954321