文本文件:如果行不是以数字开头,如何删除换行符? (在 emacs 或 sed 中)
text file: how to remove line break if line does not start with number? (in emacs or sed)
我有一个文本文件(数据库输出)换行符太多,所以我必须删除其中一些换行符(但不是全部)。
我设法手工完成了,但是行太多(数千行),因此自动化解决方案会有所帮助。
目的是最后我在文本文件中只有以数字开头的行,所有其他行都应附加到上一行(最后一行以数字开头)
代码应该做什么:
- 转到每一行
- 如果它不以数字 [0-9] 开头,则转到此行的开头
(C-a)
并删除换行符 before (就像打backspace
)
(带数字的行没有前导空格!)
- 然后转到下一行并执行相同的操作
这应该很容易,但我不知道怎么做。
Emacs 的解决方案会很有帮助,但基本上我在 CYGWIN 中可以做的任何事情也会很有帮助。
所以,目标是删除所有没有紧跟数字的换行符。一种使用 sed 的方法:
sed -i ':a $!{N; ba}; s/\n\+/\n/g; s/\n\([^0-9]\)//g' filename
这会将整行读入模式 space,将多个换行符的所有序列替换为一个,然后删除所有后面没有数字的换行符。
附录:啊,Cygwin。警告:代码按原样假定 UNIX 行结尾。要使其在具有 Windows 行结尾 1 的文件上工作,这对您来说可能很重要,请使用
sed -i ':a $!{ N; ba; }; s/\(\r\n\)\+/\r\n/g; s/\r\n\([^0-9]\)//g' filename
这对 \r\n
而不是 \n
做同样的事情。对于具有混合行结尾的文件,使用
sed -i ':a $!{ N; ba; }; s/\(\r\?\n\)\+/\n/g; s/\n\([^0-9]\)//g' filename
(或在处理文件前使用dos2unix
/unix2dos
。)
1 当从 UNIX 路径打开文件或涉及管道时,月亮是凸起的,具体取决于 Cygwin 设置。 Cygwin 中的行尾处理是 convoluted and confusing,一般情况下,在使用 Cygwin 工具处理文件之前将文件转换为 UNIX 行尾,然后再将其转换回来是一个不错的方法。
我有一个文本文件(数据库输出)换行符太多,所以我必须删除其中一些换行符(但不是全部)。
我设法手工完成了,但是行太多(数千行),因此自动化解决方案会有所帮助。
目的是最后我在文本文件中只有以数字开头的行,所有其他行都应附加到上一行(最后一行以数字开头)
代码应该做什么:
- 转到每一行
- 如果它不以数字 [0-9] 开头,则转到此行的开头
(C-a)
并删除换行符 before (就像打backspace
)
(带数字的行没有前导空格!) - 然后转到下一行并执行相同的操作
这应该很容易,但我不知道怎么做。
Emacs 的解决方案会很有帮助,但基本上我在 CYGWIN 中可以做的任何事情也会很有帮助。
所以,目标是删除所有没有紧跟数字的换行符。一种使用 sed 的方法:
sed -i ':a $!{N; ba}; s/\n\+/\n/g; s/\n\([^0-9]\)//g' filename
这会将整行读入模式 space,将多个换行符的所有序列替换为一个,然后删除所有后面没有数字的换行符。
附录:啊,Cygwin。警告:代码按原样假定 UNIX 行结尾。要使其在具有 Windows 行结尾 1 的文件上工作,这对您来说可能很重要,请使用
sed -i ':a $!{ N; ba; }; s/\(\r\n\)\+/\r\n/g; s/\r\n\([^0-9]\)//g' filename
这对 \r\n
而不是 \n
做同样的事情。对于具有混合行结尾的文件,使用
sed -i ':a $!{ N; ba; }; s/\(\r\?\n\)\+/\n/g; s/\n\([^0-9]\)//g' filename
(或在处理文件前使用dos2unix
/unix2dos
。)
1 当从 UNIX 路径打开文件或涉及管道时,月亮是凸起的,具体取决于 Cygwin 设置。 Cygwin 中的行尾处理是 convoluted and confusing,一般情况下,在使用 Cygwin 工具处理文件之前将文件转换为 UNIX 行尾,然后再将其转换回来是一个不错的方法。