如何在Vim中匹配模式后删除每行结尾的文本?

时间:2015-09-16 08:27:27

标签: vim sed

我有一个包含以下内容的文件:

domproxy1.dom.company.com  Centos CentOS 6.5 production  S5520UR   7 days ago  Edit
domproxy10.dom.company.com Centos CentOS 6.5 production  S5520UR   7 days ago  Edit
domproxy11.dom.company.com Centos CentOS 6.5 production  X8DTU   7 days ago  Edit
domproxy15.dom.company.com Centos CentOS 6.6 production  X8DTU   8 days ago  Edit
domproxy2.dom.company.com  Centos CentOS 6.5 production  S5520UR   7 days ago  Edit
domproxy3.dom.company.com  Centos CentOS 6.5 production  S5520UR   7 days ago  Edit
domproxy4.dom.company.com  Centos CentOS 6.5 production  S5520UR   7 days ago  Edit
domproxy5.dom.company.com  Centos CentOS 6.5 production  S5520UR   7 days ago  Edit
domproxy6.dom.company.com  Centos CentOS 6.5 production  S5520UR   7 days ago  Edit
domproxy9.dom.company.com  Centos CentOS 6.5 production  S5520UR   7 days ago  Edit
domproxy29.dom.company.com Centos CentOS 6.6 production  S2600GZ   about 1 month ago Edit
orgcmsui03.nj.company.com  Centos CentOS 6.6 production  Virtual Mac...    6 days ago  Edit
domftp01.dom.company.com Centos CentOS 6.4 production  ProLiant DL...    40 minutes ago  Edit

我想用(.com *)替换每行(.com)的结尾,这意味着删除每行中主机名后面的所有内容。

vim内,我尝试了以下内容:

:%s/.com $/.com/g
:%s/.com*$/.com/g
:%s/.com .*/.com/g

据我所知,这就是我正在做的事情:

:%s/ - search on all the file
.com .*/ - the search pattern
.com/ - the replace pattern
/g - global

但无济于事,我做错了什么?

4 个答案:

答案 0 :(得分:2)

:%s/[.]com.*/.com

这将完全符合您的需要。

%s搜索整个文件

/[.]com.*查找.com以及随后的内容直到行尾

/.com.com

替换搜索到的模式

您不必在最后使用/g,因为每行只有一次.com

如果您不希望.company.com替换.com,请使用以下命令

:%s/[.]com\>.*/.com

答案 1 :(得分:2)

我喜欢:normal来完成这些任务:

:%norm f D

但是,我们可以通过使用awk过滤cut:%!来做更多* nix-y。

:%!cut -f1 -d' '
:%!awk '{print $1}'
:%!awk '$0=$1'

使用\zs进行替换:

:%s/\.com\zs.*

如需更多帮助,请参阅:

:h :normal
:h f
:h D
:h :range!
:h /\zs
:h magic

答案 2 :(得分:1)

您还可以使用power of g

:g/[.]com\>/normal nelD

:g/[.]com/normal nelD

如你所愿。

它的工作原理如下:

在每一行中找到.com并在正常模式下执行命令nelD

n找到下一个匹配,e转到单词结束,l向右移动,D删除直到行尾。

答案 3 :(得分:1)

我这样做:

:%s/\.com\zs\s.*/

匹配dot 'com' whitespace(例如空格或标签),删除 dot com之后的所有

注意 dot 已转义,否则任何字符匹配。