如何替换VIM中的行结尾

时间:2010-03-04 14:37:13

标签: vim replace line-endings

如何替换大文件中的所有行结尾(> 100MB)? 我试过了

:%s/\n/, /g

但是太慢了。

6 个答案:

答案 0 :(得分:8)

所以,我经历了测试/计时其他人给出的一些答案,以及我自己的python答案。这是我得到的:

<强> TR

> time tr "\n" "," < lines > line
real    0m1.617s
user    0m0.100s
sys     0m1.520s

<强>蟒:

> time python -c 'import sys; print sys.stdin.read().replace("\n",", "),' < lines > line
real    0m1.663s
user    0m0.060s
sys     0m1.610s

<强> AWK:

> time awk '{printf("%s, ", $0)}' lines > line                                 
real    0m1.998s
user    0m0.390s
sys     0m1.600s

<强> perl的:

> time perl -e 'while (<>) { chomp; print "$_, " }' lines > line
real    0m2.100s
user    0m0.590s
sys     0m1.510s

<强> sed的:

> time sed 's/$/, /g' lines > line                                             
real    0m6.673s
user    0m5.050s
sys     0m1.630s

这是我使用的文件:

> ls -lh lines
-rw-r--r-- 1 some one 101M 2010-03-04 19:54 lines
> wc -l < lines
1300000
> head -n 3 < lines
The pretty pink puma pounced on the unsuspecting aardvark, the scientist watched.
The pretty pink puma pounced on the unsuspecting aardvark, the scientist watched.
The pretty pink puma pounced on the unsuspecting aardvark, the scientist watched.
> head -n 1 < lines | wc -c
82

最初的时间是在cygwin中进行的,现在它们已经完全更新了ubuntu 9.10。此外,文本文件大小增加到100兆,线宽80个字符。你可以看到除了sed之外的任何东西都是个好主意。

答案 1 :(得分:3)

:%s/$/, /后跟:1,$j可能会更快。否则,在外部实用程序中执行此操作:

perl -e 'while (<>) { chomp; print "$_, " }' input_file > output_file

awk '{printf("%s, ", $0)}' input_file > output_file

不知道我的头顶哪个会最快。

答案 2 :(得分:2)

使用此Perl脚本浏览您的文件;它比用VIM将所有内容保存在内存中更快。只需将输出传输到新文件。

#!/usr/local/bin/perl

while (<>) {
  $_ =~ s/\n/,/g;
  print $_;
}

答案 3 :(得分:0)

你必须在vim中这样做吗?

有一个很好的Unix实用程序可以进行基于字符的翻译。它被称为tr。 一些reference

在你的情况下,它将是:

tr "\n" "," < input_file > output_file

答案 4 :(得分:0)

$ more file
aaaa
bbbb
cccc
dddd
eeee

$ awk 'NR>1{printf("%s, ", p)}{p=$0}END{print p}' file
aaaa, bbbb, cccc, dddd, eeee

$ sed -e :b -e '$!N;s/\n/, /;tb' file

答案 5 :(得分:0)

最好的工具是sed,您可以使用它:命令

所以请使用:!sed -e 's/\n/,/g' % > %.tmp ; cat %.tmp > % ; rm %.tmp'

在集成到当前文件之前,您需要创建一个包含更改的tmp文件