linux日常命令之三

换行符

linux换行符为\n,而windows换行符为\r\n。

因此,linux的原生文本文件,换行符为\n,而windows为\r\n;将linux文件拷贝至windows,换行符保持不变,仍为\n,windows同理。

需要注意的是,将windows原生文件拷贝至linux处理时,若要去除换行符,只需去除\n即可,因为linux不识别\r。但是将去除\n的文件再拷回windows时,\r依然存在,需做相应处理。

对于linux长文本而言,去换行符时最好去除\r,以免出问题。linux中,\r为^M,需按住ctrl+V,然后再敲M得到。

sed删除换行符\n

使用命令sed "s/\n//g" file发现,没起到任何效果。

经查sed官方用户手册,才得知,sed是按行处理文本数据的,每次处理一行数据后,都会在行尾自动添加trailing newline,其实就是行的分隔符即换行符。

个人理解为,\n作为行结束的标志,并不作为行处理的文本内容。因此需要使用循环处理。

一、使用test跳转命令,实现替换换行符:

sed ":a;N;s/\n//g;ta" a.txt

N是把下一行加入到当前的hold space模式空间里,使之进行后续处理,最后sed会默认打印hold space模式空间里的内容。也就是说,sed是可以处理多行数据的。

:a和ta是配套使用,实现跳转功能。t是test测试的意思。另外还有:a和ba的配套使用方式,也可以实现跳转功能。b是branch分支的意思。

二、使用branch跳转命令,实现替换换行符。

sed ":a;N;s/\n//g;$!ba" a.txt

增加$!ba语句,$的意思是最后一行,不跳转到标记a处,即退出命令循环。

branch和test区别:

branch无论每行执行成功与否,都循环到文本结束;而test在某行执行失败后便跳出循环。

branch

branch循环到文本结束。比如sed ":a;N;s/\n//g;ba" a.txt,转换成自然语言的描述,就是

while(1) {

 N;

 s/\n//g;

}

test

test可以根据替换命令的完成是否成功,决定是否跳转。比如sed ":a;N;s/\n//g;ta" a.txt,转换成自然语言的描述,就是

while(state == 1) {     #默认state就当是1好了。

 N;

 s/\n//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表示每行的字段数

猜你喜欢

转载自www.cnblogs.com/ohmyuan/p/10123348.html