一、换行符
linux换行符为 ,而windows换行符为 。
因此,linux的原生文本文件,换行符为 ,而windows为 ;将linux文件拷贝至windows,换行符保持不变,仍为 ,windows同理。
需要注意的是,将windows原生文件拷贝至linux处理时,若要去除换行符,只需去除 即可,因为linux不识别 。但是将去除 的文件再拷回windows时, 依然存在,需做相应处理。
对于linux长文本而言,去换行符时最好去除 ,以免出问题。linux中, 为^M,需按住ctrl+V,然后再敲M得到。
二、sed删除换行符
使用命令sed "s/ //g" file发现,没起到任何效果。
经查sed官方用户手册,才得知,sed是按行处理文本数据的,每次处理一行数据后,都会在行尾自动添加trailing newline,其实就是行的分隔符即换行符。
个人理解为, 作为行结束的标志,并不作为行处理的文本内容。因此需要使用循环处理。
一、使用test跳转命令,实现替换换行符:
sed ":a;N;s/ //g;ta" a.txt
N是把下一行加入到当前的hold space模式空间里,使之进行后续处理,最后sed会默认打印hold space模式空间里的内容。也就是说,sed是可以处理多行数据的。
:a和ta是配套使用,实现跳转功能。t是test测试的意思。另外还有:a和ba的配套使用方式,也可以实现跳转功能。b是branch分支的意思。
二、使用branch跳转命令,实现替换换行符。
sed ":a;N;s/ //g;$!ba" a.txt
增加$!ba语句,$的意思是最后一行,不跳转到标记a处,即退出命令循环。
branch和test区别:
branch无论每行执行成功与否,都循环到文本结束;而test在某行执行失败后便跳出循环。
branch
branch循环到文本结束。比如sed ":a;N;s/ //g;ba" a.txt,转换成自然语言的描述,就是
while(1) {
N;
s/ //g;
}
test
test可以根据替换命令的完成是否成功,决定是否跳转。比如sed ":a;N;s/ //g;ta" a.txt,转换成自然语言的描述,就是
while(state == 1) { #默认state就当是1好了。
N;
s/ //g; #成功,返回state为1;否则返回state=0。此state用于跳转判断。
}
else {
last; #即退出循环语句。
}
原文:https://blog.csdn.net/u011729865/article/details/71773840
三、sed
删除:d,替换:s
sed '2d' file -----删除file文件的第二行
sed '2,$d' file -----删除file文件的第二行到末尾所有行
sed '$d' file -----删除file文件的最后一行
sed '/test/'d file -----删除file文件所有包含test的行 #其中两个’/’用于匹配字符
sed '1~2d' file -----删除奇数行
sed '1~2!d' file -----删除偶数行
sed '/^$/d' file -----删除空行
awk 'NF > 0' file -----删除空行 #NF表示每行的字段数