我有一个包含大约200个条目的文件,每个条目都与此相似:
001 907123456789
002 907234567890
003 907345678901
004 907456789012
我想从每个电话号码中删除前导9(即列表中的第二项)我正在努力寻找能够帮助我解决这种情况的任何事情,因为电话号码不是第一项线。
我刚注意到文件中的空格没有正确复制,前3位数快速拨号和电话号码之间有5个空格。
有关如何做到这一点的任何建议将不胜感激。
答案 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