-6

我有一个包含大约 200 个条目的文件,每个条目都类似于:

001     907123456789  
002     907234567890  
003     907345678901  
004     907456789012  

我想从每个电话号码中去掉前导 9(即列表中的第二项)我正在努力寻找在这种情况下对我有帮助的任何东西,因为电话号码不是该行中的第一项。

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

任何有关如何执行此操作的建议将不胜感激。

4

4 回答 4

3

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

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

请注意,这仅在电话号码具有您提供的确切格式时才有效。正则表达式非常具体,使其不太可能搞砸文件中的任何其他内容。


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

%s意思是“在每一行做替换”。这实际上不是正则表达式的一部分。这是一个标准的 vim 命令。

^是一个锚点,意思是“这必须是行首的位置”——或者,换句话说,“没有任何东西可以在该行的以下内容之前。”

\d\{3}意思是“这里必须恰好是三个数字”,这意味着该行的前三个字符必须是数字。

(space) 表示接下来必须有一个文字空格。去搞清楚。

\zs意思是“真正从这里开始比赛”。之前的东西必须匹配,但不要“选择”之前的任何东西。

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

/,最后一个字符,意思是“接下来的一切都是你应该替换匹配的东西”。由于没有任何内容跟随它,它的意思是“什么都没有替换匹配”。

完毕!

编辑:

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

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

%s/^\d\{3}\s\+\zs9/
于 2013-07-30T15:22:17.083 回答
0

只需将所有 9 前面的空格替换为空白即可。

's/ 9//g'

于 2013-07-30T15:13:27.240 回答
0

我投票结束了你的问题,因为你没有表现出任何试图提出你自己的解决方案的尝试,你应该尝试,并展示你做了什么,什么没用。

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

001 9\(\d*\)

然后在替换中使用它。

如果不是所有数字都以开头,001则调整正则表达式以处理文件中的所有数字。

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

001 1234001 99

在这种情况下,弄清楚如何改进正则表达式以仅匹配您想要匹配的内容(不要只是要求将答案放在盘子上。)

于 2013-07-30T15:20:15.513 回答
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
于 2013-07-30T15:28:08.857 回答