vi/vim,如何将所有行的第 n 个单词写到新文件中

vi/vim,如何将所有行的第 n 个单词写到新文件中

如何将所有行的第 n 个单词写入新文件?例如,我想要在 new_file.txt 中写出所有行的第二个单词:

旧文件.txt:

pippo pluto paperino 
gigi lui marco 
piero andrea chiara

新文件.txt:

pluto  
lui   
andrea

答案1

第一步,删除每行除第二个单词之外的所有单词。这是一个相当简单的:%norm命令:

:%norm dwwhD

dwwhD这就像在每一行手动输入一样,但速度更快。第二步,保存到新文件:

:w new_file.txt

然后退出而不保存,以便old_file.txt保持不变:

:q!

答案2

:!cut % '-d ' -f2 > new_file.txt

请注意,默认分隔符是cut制表符,因此您需要使用“-d”将分隔符设置为空格。

在 Vi 内部,您可以用作%当前文件名的替换。

答案3

您可以使用简单的 bash 脚本从终端命令行执行此操作。第一的循环遍历文件的内容。然后对于每一行,将 echo 通过管道传输到 awk 中并让 awk 提取第二列。最后将该文本重定向到一个新文件中。

将所有这些放在一起:

while read line; do
    echo $line | awk '{print $2}' >> new_file.txt
done <old_file.txt

答案4

使用:s带有正则表达式的命令:

:%s/\v^\s*\S+(\s+(\S+).*)?/\2

\v告诉 Vim 使用“非常神奇”的正则表达式风格,这类似于 grep 或 pcre 中的扩展正则表达式。

正则表达式匹配开头的单个单词,前面可能有一些可选的空格。然后,在一些空白之后,第二个单词被捕获到 group 内\2。最后,a.*匹配该行的整个其余部分。

第一个单词后面的部分是可选的(分组在括号中并与最后的 一起可选?)。这确保了具有单个单词的行仍然会匹配,在这种情况下,它们将被替换为空行,我想这就是具有单个单词的行所期望的,因为第二个作品在该行中是空白的案件。这是使用正则表达式执行此任务的优点之一,因为您可以更好地控制如何处理具有极端情况的行。

最后\2用group进行替换。它单独捕获了该行的第二个单词。

然后您可以将修改的内容保存为新文件名:

:saveas new_file.txt

这将保留您的未修改状态old_file.txt,并确保对当前缓冲区的进一步修改只会转到new_file.txt.

相关内容