Regex从电话号码中删除前导9,该号码不在电话线的开头

Regex从电话号码中删除前导9,该号码不在电话线的开头,regex,vim,Regex,Vim,我有一个大约有200个条目的文件,每个条目类似于: 001 907123456789 002 907234567890 003 907345678901 004 907456789012 我想从每个电话号码中去掉前面的9,即列表中的第二项。我正在努力寻找任何对我有帮助的东西,因为电话号码不是第一项 我刚刚注意到文件中的空格没有正确复制,前3位快速拨号和电话号码之间有5个空格 如果您对如何执行此操作有任何建议,我们将不胜感激。只需将所有9前面的空格

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

001     907123456789  
002     907234567890  
003     907345678901  
004     907456789012  
我想从每个电话号码中去掉前面的9,即列表中的第二项。我正在努力寻找任何对我有帮助的东西,因为电话号码不是第一项

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


如果您对如何执行此操作有任何建议,我们将不胜感激。

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


's/9//g'

我投票决定结束你的问题,因为你没有尝试提出自己的解决方案,你应该尝试,并展示你做了什么和没有做什么

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

001 9\(\d*\)
然后用它来代替

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

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

001 1234001 99

在这种情况下,找出如何优化正则表达式以仅匹配您想要匹配的内容不要只要求将答案放在盘子上交给您。

以下命令应满足您的要求:

%s/^\d\{3} \zs9/
请注意,只有当电话号码的格式与您给出的格式完全相同时,此功能才起作用。正则表达式非常具体,使得它不太可能破坏文件中的任何其他内容

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

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

^是一个锚点,这意味着这必须是线的起点位置——或者,换句话说,线上的以下内容之前不能有任何内容

\d\{3}表示这里必须正好有三个数字,这意味着行的前三个字符必须是数字

空格表示接下来必须有一个文本空格。算了吧

\zs的意思是在这里开始比赛。前面的内容必须匹配,但不要选择前面的内容

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

/,最后一个字符,表示接下来的所有内容都是您应该用其替换匹配项的内容。因为它后面没有任何内容,所以它意味着用任何内容替换匹配内容

完成了

编辑:

显然,所讨论的数据文件在第一组数字和第二组数字之间没有一个空格。为此,请更改正则表达式中影响空格匹配的部分

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

%s/^\d\{3}\s\+\zs9/
您可以使用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

您希望从中删除9的数字总是跟在空白后面,或者是否有其他可能,如连字符?。。。它们都有001前缀吗?不,总是跟在空格后面,但是当我试图用前面的空格搜索时,我没有得到任何结果。请看第一个答案。前导号码发生了变化,它们是快速拨号,所以001、002等高达200,可能应该放进几行:你确定这是空格,而不是制表符吗?好主意,感谢您,我刚刚在vim中尝试了它,它建议无法匹配9的模式,如果我使用“sed-I s/\9//g filename”,它将返回,没有错误,但没有更改,我也尝试过在空格前不使用转义字符,以达到相同的效果。i、 e.在vim中,我使用了:%s/9//g,它返回E486:找不到模式:9@Rumbles这可能是因为您使用的是:s,没有%range修改器。那么,这个命令将只影响一行,尽管g标志将使它影响整行。我确实使用范围修饰符尝试了这个命令,但它返回了pattern not found:“\zs是否有一个不包含后面的内容的对应项?明白了\泽。非常有用!检查:help/\zs以获取更多信息。很好,猜测:help是针对vim的,没有vim,但是\zs在SED中工作得很好谢谢,但是我在搜索中没有得到任何回报,文件在两个项目之间有5个空格,但即使在其中放入5个空格也不会返回任何结果。我得到的结果是:E486:找不到模式:^\d\{3}\zs9Ord。我添加了4个空格,使总数为5,并在编号004 98577272884上进行了尝试,两部分之间有5个空格。它工作得很好。如果要使空格数至少为1,而不是正好为n,其中n是某个数字,请使用%s/^\d\{3}\s\+\zs9/。虽然我查看了一些指南,但没有一个指南涉及对行首以外的前导字符进行更改。所以我被这个正则表达式卡住了。谢谢你的帮助,但是当我运行t
他命令我得到以下命令:sed的/^[0-9]\+9/\1/'speeddials.txt 001 907123456789 002 90734567801 003 907456789012将该部分省略了大约5个空格,但正如在Riley答案中一样,添加一个+以匹配多个空格