sed使用
, 11 Nov 2019
sed 命令是一个面向行处理的工具,它以“行”为处理单位,针对每一行进行处理。与awk不同,awk是以”列“为处理单位[当然,awk也是一行行进行处理的]。 在线教程
sed命令格式 >sed [options] ‘command’ file(s) sed [options] -f scriptfile file(s)
工作流
读取: SED从输入流(文件,管道或者标准输入)中读取一行并且存储到它叫做 模式空间(pattern buffer) 的内部缓冲区
执行: 默认情况下,所有的SED命令都在模式空间中顺序的执行,除非指定了行的地址,否则SED命令将会在所有的行上依次执行
显示: 发送修改后的内容到输出流。在发送数据之后,模式空间将会被清空。
–help
中文帮助文档 选项: -i 参数可以直接对文件进行修改,虽然好用,但是记住你要知道你在干嘛 -n 参数使得sed不从模式空间输出,只有遇到如5p时,才输出第五行内容。 -e 多次使用sed 命令: p打印;d删除;s替换 g:全局性 ; i 忽略大小写
#删除第一行,和最后一行
sed -i -e '1d' -e '$d' 1.txt
#打印1到2行
sed '1,2p' 1.txt
#删除所有空行
sed '/^$/d' 1.txt
#全局替换
echo "a,b,c,d" |sed 's/,/\n/g'
#试试下面这个
echo "a,b,c,d" |sed 's/,/\n/g'|sed 's/\n/,/g'
#失败了,没有替换换行符。这跟sed的行处理方式有关,sed读取一行时,会先把换行符去掉,处理完后再添加上
# 用tr命令
echo "a,b,c,d" |sed 's/,/\n/g'|tr -t '\n' ','
为了用sed处理换行符,使用标签跳转和N
sed ':label;N;s/\n/:/;b label' filenameb可以换成t
:label;这是一个标签,用来实现跳转处理,名字可以随便取(label),后面的b label就是跳转指令
N是sed的一个处理命令,追加文本流中的下一行到模式空间进行合并处理,因此是换行符可见
比如fastq文件每四行为一个循环,我们提取序列行试试
sed -n '1d;N;N;N;P;d' 1.fastq#删除第一行,追加后面三行,打印第二行,删除
标签跳转和N的追加命令实现了每一行的不间断放入模式处理空间,从而不会漏掉每一个换行符。
echo "a,b,c,d" |sed 's/,/\n/g'|sed ':x;N;s/\n/,/;b x'#a,b,c,d
$ echo "a,b,c,d" |sed 's/,/\n/g'|sed 'N;s/\n/,/'
a,b
c,d
看看这个命令
echo "a,b,c,d" |sed 's/,/\n/g'|sed 's/$/,/'
a,
b,
c,
d,
#你可以在最后替换时不使用管道而是重定向输入文件,cat -A 文件 就大概了解了
sed中的n和~
sed '8,80{n;n;n;d}' filename
#从第8行起(包含),一次读取9/10/11行,然后读取11行后,执行d命令,就是删除处理空间中的第11行,之后从12行开始,读取13/14/15, 删除15行,以此类推,直到第80行。
sed '11~4d' filename
#实现同样效果,只是无法界定最后行数,读取直到文件结束。
n表示读取文本流中的下一行到模式空间(N为追加)