从文本文件中删除模式后的所有字符

13

我有一个包含数千行文本的文本文件。每一行都以

结尾。

\\server\share\file.txt -> information
我想删除文件扩展名后的空格后面的所有内容,也就是在“ ->”之后的一切(第一个引号后有一个空格)。
我想使用vim来完成此任务,因为我正在尝试更多地了解它,但任何程序都可以; 我希望能够尽快完成这个任务。

可能可以使用 (?!\.\w{2,3})(\s->\s\w+)$ 来查找尾随文本,但不熟悉 vim 的正则表达式,无法制作“执行此行”类的解决方案。 - Brad Christie
5个回答

24

您的描述是自相矛盾的。

  1. "文件扩展名后面的空格之后的所有内容"
  2. "因此,“->”后面的所有内容(第一个引号后面有一个空格)"

您是否想保留箭头?

1可以通过以下方式轻松完成:

:%s/ ->.*/

而且实际上,如果您确实想在箭头前保留空格,就像您所说的那样,它应该是:

:%s/ ->.*/ /

可以用以下方式完成2:

:%s/\( ->\).*/\1/

如果你希望在替换之前查看搜索结果,可以先使用 / 构建搜索。

/\( ->\).*

这将高亮显示所有结果,以确保您替换正确的内容。然后,您可以使用空搜索词执行替换命令来使用最后一次搜索(已经高亮显示的内容)。

:%s//\1/

不,仅当模式是“非常魔法”的时候,2才是有效的。你需要使用\(\) - Benoit
你说得对。我确实说了两件不同的事情。对此感到抱歉。当时正在听某人嘟囔警察有多愚蠢,一边打字一边听。 :/ - AaronJAnderson
Benoit,你说得对。它们确实在那里,但被HTML化程序删除了,我没有注意到。谢谢。 - Tommi Kyntola

7
如果你想要保留箭头:
:%s/ ->\zs .*//

如果您想删除它:

:%s/ -> .*//

1

这可以很容易地使用分割方法完成。由于您的行都是相同的,并且有一个特殊的箭头->符号,因此在该符号上进行分割,并获取第一个元素。

awk -F"->" '{print $1}' file

如果需要,重定向到新文件。


1
正向预查可能有效,类似于/(?= ->).*/匹配并替换为空。

Vimзҡ„еҗҺйЎҫж–ӯиЁҖжҳҜ\@<=гҖӮдҫӢеҰӮпјҡ:%s/\( -> \)\@<=.*//гҖӮиҝҳеҸҜд»ҘжҹҘзңӢ:help /\@<=гҖӮ - Benoit

0
全局替换
 -> .*

使用空字符串

(我假设您想删除->,即使您说“之后”。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接