文本文件:如果行不以数字开头,如何删除换行符? (在emacs或sed中)

时间:2015-04-08 14:46:46

标签: emacs sed elisp

我的文本文件(数据库输出)包含太多换行符,所以我必须删除部分换行符(但不是全部)

我设法手动完成,但行数太多(数千),因此自动化解决方案会有所帮助。

目的是最后我只有文本文件中以数字开头的行,所有其他行都应附加到前一行(最后一行以数字开头)

代码应该做什么:

  • 转到每一行
  • 如果它不是以数字[0-9]开头,那么请转到此行(C-a)的开头,然后在之前删除换行(就像点击backspace
    (带数字的行没有前导空格!)
  • 然后转到下一行并执行相同的操作

这应该很容易,但我不知道这么做。

Emacs的解决方案会有所帮助,但基本上我在CYGWIN中可以做的任何事情也会非常有帮助。

1 个答案:

答案 0 :(得分:1)

因此,目标是删除所有未紧跟数字的换行符。 sed的一种方法:

sed -i ':a $!{N; ba}; s/\n\+/\n/g; s/\n\([^0-9]\)/\1/g' filename

这会将整行读入模式空间,用一个替换多个换行符的所有序列,然后删除所有不包含数字的换行符。

附录:啊,Cygwin。警告:代码实际上是假定UNIX行结尾。要使其适用于Windows行结尾 1 的文件,这可能对您很重要,请使用

sed -i ':a $!{ N; ba; }; s/\(\r\n\)\+/\r\n/g; s/\r\n\([^0-9]\)/\1/g' filename

\r\n而不是\n也是如此。对于具有混合行结尾的文件,请使用

sed -i ':a $!{ N; ba; }; s/\(\r\?\n\)\+/\n/g; s/\n\([^0-9]\)/\1/g' filename

(或在处理文件之前使用dos2unix / unix2dos。)

1 当从UNIX路径打开文件或涉及管道且月亮是隆起时,取决于Cygwin设置。 Cygwin中行结尾的处理是convoluted and confusing,一般来说,在使用Cygwin工具处理文件之前将文件转换为UNIX行结尾并不是一个糟糕的方法,然后将其转换回来。