sed编辑生物信息数据

文章目录

stream editor 流编辑器

sed工具工作原理及特性

  1. 行编辑器 (全屏编辑器:vi)

  2. 按行处理,读取一行到临时缓冲区,也就是模式空间pattern space

  3. 默认不编辑原文件,仅对模式空间中的数据做处理,如果需要修改需加-i参数

  4. 默认情况下,模式空间中的内容打印一次,被模式匹配到的内容被命令动作处理过,一般情况下会再次打印 到标准输出,除非使用d选项。

  5. 支持正则和扩展正则表达式

按行处理,读取一行到临时缓冲区,也就是模式空间 ,默认不改变原文件;经过模式匹配处理后,将模式空间中的内容打印到标准版输出并自动清空该空间中的内容,该空间是sed的主要活动空间。

sed 命令

NAME

  • sed - stream editor for filtering and transforming text

SYNOPSIS

  • sed [OPTION]… {script-only-if-no-other-script} [input-file]…

  • sed 选项 地址定界 编辑命令 文件

sed option ‘AddressCommand’ file …

Options
-n : 静默模式,不输出模式空间中的内容至屏幕,即关闭不能被模式匹配到的行到标准输出中
-e : 多项编辑一次执行
-f FILE : FILE中每行是一个操作命令
-r : 支持扩展正则表达式
-i : 直接保存至原文件中
Address
  1. startline,endline 例如:1,100
  2. /RegExp/ 例如:/^root/
  3. /pattern1/,/pattern2/ 解释:第一次被pattern1匹配到的行开始,至第一个被pattern2匹配到的行束,这中间的所有行
  4. lineNumber 指定行,\$:最后一行
  5. startline,+N 从startline开始,向后的N行
Command

例如:

sed -n ‘5,8p’ passwd

sed ‘1,2d’ passwd

sed ‘3,$d’ passwd

地址定界常规方法

基因组注释文件(gtf)数据示例:

!cat ./data/demo.gtf
##gff-version 3
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

空地址:即对全文进行处理

%%bash
sed 's/AB/ab/' ./data/demo.gtf
##gff-version 3
ab	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

单地址

%%bash
#指定行
sed -n '$p' ./data/demo.gtf

echo '----------------------'
#/pattern/ : 被模式匹配到的每一行 
awk '{print $0}' ./data/demo.gtf |sed -n '/.*exon/p' 
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
----------------------
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";

地址范围

%%bash
#显示除2到5行的所有行
sed '2,5d' ./data/demo.gtf

echo '----------------------'
#删除2向下5行
sed '2,+5d' ./data/demo.gtf

echo '----------------------'
#删除从第1行到被模式匹配到的第一个行的位置
sed '1,/.*start_codon/d' ./data/demo.gtf

echo '----------------------'

#删除模式1匹配到的行和被模式2匹配到的行 
sed '/.*CDS/,/.*start_codon/d' ./data/demo.gtf
##gff-version 3
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
----------------------
##gff-version 3
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
----------------------
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
----------------------
##gff-version 3
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

步进地址表示法

%%bash

#1~2: 所有奇数行
sed -n '1~2p' ./data/demo.gtf

echo '---------------------------------'
#2~2: 所有偶数行
sed -n '2~2p' ./data/demo.gtf

##gff-version 3
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
---------------------------------
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

sed编辑命令

  • d : 删除模式空间中的内容

  • p : 显示被模式框定的内容

  • a \line : 追加line行至匹配到行的后面,如果是多行可使用\n实现多行追加

  • P : 只显示模式空间中的第一行

  • i \line : 添加line行到匹配行的前面,如果是多行可使用\n实现多行添加

  • c \line : 把匹配到的行替换为line行

  • w /PATH : 将模式空间匹配到的行,写入指定文件中

  • r /PATH : 将PATH中指定的文件写入匹配到的行下方,多用于文件合并

  • q : 退出sed,一般用于打印到第几行即退出

  • y : 完成大小写替换(等同于s///,基本不用)

  • = : 匹配到的行,显示一个行号,默认在其匹配到的行上方显示对应的行号,如果需要只显示行号,需要加-n参数,把模式空间中的内容关闭显示。

  • ! : 条件取反,一般用于模式之后,命令之前

  • s/pattern/string/ : 字符替换查找,其分隔符可自动指定,常用的有,s@pattern@string@、s#pattern#string#

  • n : 读取下一行覆盖模式空间中的行

  • N : 读取下一行并追加到模式空间中的行后面,使用\n分隔

  • {} : 多命令同时执行时,需要使用{}括起来

  • h : 把模式空间中的内容覆盖至保持空间中

  • H : 把模式空间中的内容追加至保持空间中

  • g : 把保持空间中的内容覆盖至模式空间中

  • G : 把保持空间中的内容追加至模式空间中

  • x : 把模式空间中的内容到保持空间中的内容互换,初始保持空间中为空

d : 删除模式空间中的内容

%%bash
sed '2,$d' ./data/demo.gtf

echo
#删除奇数行,只显示偶数行
sed '1~2d' ./data/demo.gtf
##gff-version 3

AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

p : 显示被模式框定的内容

%%bash
#查找demo.gtf文件中第三列以stop_codon结尾的行并打印出来
awk '{print $3}' ./data/demo.gtf   |sed -n '/stop_codon$/p' 
stop_codon

a \line : 追加line行至匹配到行的后面,如果是多行可使用\n实现多行追加

%%bash
#查找匹配到start_codon的行,并在后面添加line1,line2两行内容
sed '/.*start_codon/ a\line1\nline2' ./data/demo.gtf

#在passwd的第五行下追加一行‘hello world’
echo
sed  '5a\hello world' ./data/demo.gtf

##gff-version 3
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
line1
line2
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

##gff-version 3
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
hello world
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

P : 只显示模式空间中的第一行

%%bash
#显示结果为1、3两行
#N : 读取下一行并追加到模式空间中的行后面,使用\n分隔
#默认动作先读取两行,然后执行P操作
seq 5 | sed -n 'N;P' 

#显示结果为1,3,5
echo 
seq 6 | sed -n 'N;P' 
1
3

1
3
5

i \line : 添加line行到匹配行的前面,如果是多行可使用\n实现多行添加

%%bash
#查找匹配到bash结尾的行,并在前面添加line1,line2两行内容
sed '/^#/ i\line1\nline2' ./data/demo.gtf

#在passwd的第五行前追加一行‘hello world’
echo
sed  '5i\hello world' ./data/demo.gtf
line1
line2
##gff-version 3
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

##gff-version 3
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
hello world
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

c \line : 把匹配到的行替换为line行

%%bash
#将demo.gtf的第一行修改为‘helloworld’
sed '1c\hello world' ./data/demo.gtf |head -2

#匹配包含exon的行,并把其替换为newline行
echo
sed '/.*exon/c \newline' ./data/demo.gtf
hello world
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";

##gff-version 3
newline
newline
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
newline
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
newline
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
newline
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

w /PATH : 将模式空间匹配到的行,写入指定文件中

%%bash
#匹配非#开始的行,并写入当前目录下的w.txt文件中
sed -n '/^#/!w ./w.txt' ./data/demo.gtf
cat w.txt

#匹配#开始的行,并写入当前目录下的w1.txt文件中
echo
sed -n '/^#/w ./w1.txt' ./data/demo.gtf
cat w1.txt
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

##gff-version 3

r /PATH : 将PATH中指定的文件写入匹配到的行下方,多用于文件合并

%%bash
#把当前目录下的w1.txt文件写入到以#开头的行下
sed '/^#/r ./w1.txt' ./data/demo.gtf

#把当前目录下的w1.txt文件写入到第二行和第三行下
echo
sed '2,3r ./w1.txt' ./data/demo.gtf
##gff-version 3
##gff-version 3
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

##gff-version 3
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
##gff-version 3
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
##gff-version 3
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

q : 退出sed,一般用于打印到第几行即退出

%%bash
#只打印文件中的前3行,等同于sed -n '1,3p' FILE
sed '3q' ./data/demo.gtf
echo
sed -n '1,3p' ./data/demo.gtf
##gff-version 3
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";

##gff-version 3
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";

y : 完成大小写替换(等同于s///,基本不用)

%%bash
echo "abcdef" | sed 'y/abcdef/123456/'
echo "fedcba" | sed 'y/abcdef/123456/'
echo "abcd" | sed 'y/abcd/ABCD/'

echo 
#替换1到5行的内容bash为BASH
sed '1,5y/AB/ab/' ./data/demo.gtf
123456
654321
ABCD

##gff-version 3
ab	Twinscan	exon	150	200	.	+	.	gene_id "ab.0"; transcript_id "ab.0.1";
ab	Twinscan	exon	300	401	.	+	.	gene_id "ab.0"; transcript_id "ab.0.1";
ab	Twinscan	CDS	380	401	.	+	0	gene_id "ab.0"; transcript_id "ab.0.1";
ab	Twinscan	exon	501	650	.	+	.	gene_id "ab.0"; transcript_id "ab.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

= : 匹配到的行,显示一个行号,默认在其匹配到的行上方显示对应的行号,如果需要只显示行号,需要加-n参数,把模式空间中的内容关闭显示。

%%bash
#在匹配到stop_codon的行打印其行号
sed  -n '/.*stop_codon/=' ./data/demo.gtf
sed  -n '/.*stop_codon/p' ./data/demo.gtf

linenum=`sed  -n '/.*stop_codon/=' ./data/demo.gtf`
echo "$linenum>>>`sed  -n '/.*stop_codon/p'  ./data/demo.gtf`"

#显示最后一行的行号,一般可用于显示文本的总行数。
echo
sed -n '$=' ./data/demo.gtf

#显示所有行的行号,但空行不显示行号
echo
sed -n '/./=' ./data/demo.gtf

11
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
11>>>AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";

11

1
2
3
4
5
6
7
8
9
10
11

! : 条件取反,一般用于模式之后,命令之前

%%bash
#显示以##g开头的行
sed '/^##g/!d' ./data/demo.gtf
echo
sed -n '/^##g/p' ./data/demo.gtf


##gff-version 3

##gff-version 3

s/pattern/string/ : 字符替换查找,其分隔符可自动指定,常用的有,s@pattern@string@、s#pattern#string#

%%bash
echo 替换1到5行的内容AB为ab
sed '1,5y/AB/ab/' ./data/demo.gtf

echo "y与s命令的区别"
sed '1,5s/AB/ab/' ./data/demo.gtf

echo '只能替换每行开始的第一个匹配pattern'
sed '1,5s/B/b/' ./data/demo.gtf

echo 'g全局替换'
sed '1,5s/B/b/g' ./data/demo.gtf

echo '查找1到5行B将其替换为b,并且只显示被替换过的行'
sed -n '1,5s/B/b/gp' ./data/demo.gtf
替换1到5行的内容AB为ab
##gff-version 3
ab	Twinscan	exon	150	200	.	+	.	gene_id "ab.0"; transcript_id "ab.0.1";
ab	Twinscan	exon	300	401	.	+	.	gene_id "ab.0"; transcript_id "ab.0.1";
ab	Twinscan	CDS	380	401	.	+	0	gene_id "ab.0"; transcript_id "ab.0.1";
ab	Twinscan	exon	501	650	.	+	.	gene_id "ab.0"; transcript_id "ab.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
y与s命令的区别
##gff-version 3
ab	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
ab	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
只能替换每行开始的第一个匹配pattern
##gff-version 3
Ab	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
Ab	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
Ab	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
Ab	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
g全局替换
##gff-version 3
Ab	Twinscan	exon	150	200	.	+	.	gene_id "Ab.0"; transcript_id "Ab.0.1";
Ab	Twinscan	exon	300	401	.	+	.	gene_id "Ab.0"; transcript_id "Ab.0.1";
Ab	Twinscan	CDS	380	401	.	+	0	gene_id "Ab.0"; transcript_id "Ab.0.1";
Ab	Twinscan	exon	501	650	.	+	.	gene_id "Ab.0"; transcript_id "Ab.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
查找1到5行B将其替换为b,并且只显示被替换过的行
Ab	Twinscan	exon	150	200	.	+	.	gene_id "Ab.0"; transcript_id "Ab.0.1";
Ab	Twinscan	exon	300	401	.	+	.	gene_id "Ab.0"; transcript_id "Ab.0.1";
Ab	Twinscan	CDS	380	401	.	+	0	gene_id "Ab.0"; transcript_id "Ab.0.1";
Ab	Twinscan	exon	501	650	.	+	.	gene_id "Ab.0"; transcript_id "Ab.0.1";
%%bash
echo 将每行中最后一个字符删除,.$代表每行的最后一个字符
sed 's/.$//' ./data/demo.gtf
echo "将AB 替换为AB script,&表示对前面模式的引用"
sed 's/AB/& script/' ./data/demo.gtf
echo 将“#”开头的行替换为#+gtf
#sed 's/^\(#\).*/\1 gtf/' ./data/demo.gtf
#sed -r 's/^(#).*/\1 gtf/' ./data/demo.gtf
#sed -r 's#^(xxx).*#\1 gtf#' ./data/demo.gtf
sed -r 's@^(#).*@\1 gtf@' ./data/demo.gtf



将每行中最后一个字符删除,.$代表每行的最后一个字符
##gff-version 
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1"
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1"
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1"
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1"
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1"
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1"
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1"
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1"
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1"
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1"
将AB 替换为AB script,&表示对前面模式的引用
##gff-version 3
AB script	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB script	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB script	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB script	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB script	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB script	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB script	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB script	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB script	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB script	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
将“#”开头的行替换为#+gtf
# gtf
AB	Twinscan	exon	150	200	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	300	401	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	380	401	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	501	650	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	501	650	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	700	800	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	CDS	700	707	.	+	2	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	exon	900	1000	.	+	.	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	start_codon	380	382	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
AB	Twinscan	stop_codon	708	710	.	+	0	gene_id "AB.0"; transcript_id "AB.0.1";
%%bash
#去终端操作
#history > hist
cat hist|tail -2

echo "去掉空白字符"
sed 's#[[:space:]]\+##g' hist|tail -2

echo "去掉行首的空白字符"
sed 's#^[[:space:]]\+##g' hist|tail -2
 3007  2018-10-21 13:33:58 less hist 
 3008  2018-10-21 13:34:56 history > hist
去掉空白字符
30072018-10-2113:33:58lesshist
30082018-10-2113:34:56history>hist
去掉行首的空白字符
3007  2018-10-21 13:33:58 less hist 
3008  2018-10-21 13:34:56 history > hist
%%bash

echo "如果只想从第几次开始替换,可使用3g即Ng(N代表一个数值)"
echo "sksksksksksk" | sed 's/sk/SK/3g'
如果只想从第几次开始替换,可使用3g即Ng(N代表一个数值)
skskSKSKSKSK

n : 读取下一行覆盖模式空间中的行 返回

%%bash
echo "处理两行为一个单位"
echo "读取一行到pattern space ,默认输出,紧接着读取下一行覆盖原来的内容,然后执行d删除,执行默认输出,空"
seq 11 | sed  'n;d'

echo "处理两行为一个单位"
echo "读取一行到pattern space,默认输出,紧接着是p打印,然后读取下一行覆盖原来的内容,执行默认输出"
seq 11 | sed   'p;n'

echo "处理两行为一个单位"
echo "读取一行到pattern space 抑制默认输出,接着是p打印,然后读取下一行覆盖原来的内容,抑制默认输出"
seq 11 | sed -n 'p;n'


echo "读取一行到pattern space ,默认输出,紧接着读取下一行覆盖原来的内容,默认输出"
seq 11 | sed 'n'
读取一行到pattern space ,默认输出,紧接着读取下一行覆盖原来的内容,然后执行d删除
1
3
5
7
9
11
读取一行到pattern space,默认输出,紧接着是p打印,然后读取下一行覆盖原来的内容,执行默认输出
1
1
2
3
3
4
5
5
6
7
7
8
9
9
10
11
11
读取一行到pattern space 抑制默认输出,接着是p打印,然后读取下一行覆盖原来的内容,抑制默认输出
1
3
5
7
9
11
读取一行到pattern space ,默认输出,紧接着读取下一行覆盖原来的内容
1
2
3
4
5
6
7
8
9
10
11

N : 读取下一行并追加到模式空间中的行后面,使用\n分隔 返回

%%bash

echo "读取两行(以\n分隔)到pattern space中 ,然后删除pattern space中的内容,默认输出为空"
echo "最后一行是单行,所以读取一行到pattern space,默认输出"
seq 11 | sed 'N;d'

echo "显示结果为空"
seq 10 | sed 'N;d' 

echo "读取两行(以\n分隔)到pattern space中 ,然后打印pattern space中的内容,默认输出"
seq 10 | sed 'N;p' 

# seq 11 | sed 'N;p' 
读取两行(以\n分隔)到pattern space中 ,然后删除pattern space中的内容,默认输出为空
最后一行是单行,所以读取一行到pattern space,默认输出
11
显示结果为空
读取两行(以\n分隔)到pattern space中 ,然后打印pattern space中的内容,默认输出
1
2
1
2
3
4
3
4
5
6
5
6
7
8
7
8
9
10
9
10

{} : 多命令同时执行时,需要使用{}括起来 返回

%%bash
echo "读取rstudio开始的行,再读取下一行并打印模式空间的内容。"
sed -n '/^rstudio/{N;p}' passwd
读取rstudio开始的行,再读取下一行并打印模式空间的内容。
rstudio-server:x:992:990::/home/rstudio-server:/bin/bash
sunchengquan:x:1000:1000::/home/sunchengquan:/bin/bash

sed高级说明举例说明

!seq 4 | sed 'n;d'
1
3

说明:pattern space先读入1,默认输出1,然后执行到n,把下一行2读入pattern space中并覆盖原本的1。然后pattern space中的内容(2)被删除(d操作),默认输出空,所以打印出1\n3

!seq 4 | sed 'n'
1
2
3
4
!seq 4 | sed 'n;p'
1
2
2
3
4
4
!seq 5 | sed 'n;d'
1
3
5
!seq 4 | sed 'N;d'

执行N操作相当于一次性读入两行,以\n分割,或者也可以这么说,pattern space先读入行,然后执行到N,把下一行添加到当前的pattern space中,pattern space内容为两行以\n分割。

说明:pattern space先读入1,然后执行到N,把下一行添加到当前的pattern space中,pattern space内容为1\n2,然后执行d操作被删除。接下去读入3(系统读入总是覆盖原有内容),执行N,pattern space 内容变为3\n4,然后再被删除

!seq 7 | sed 'N;d'
7

理解n 与N

%%bash
seq 4 | sed 'n'
echo 'n'
seq 4 | sed -n 'n'
echo 'N'
seq 4 | sed -n 'N'
1
2
3
4
n
N

以上两都不会输出输入,-n参数把模式空间中的内容关闭显示了

%%bash
seq 4 | sed -n 'n;p'
2
4

说明:读取1到pattern space ,抑制默认输出1,接着n读取下一行2并覆盖pattern spcae的内容,p打印pattern space2,
抑制默认输出

%%bash
seq 4 | sed -n 'N;p'
# seq 4 | sed  'N;p'
1
2
3
4

说明:N读取1\n2行的内容,抑制默认输出1\n2,p打印pattern space内容1\n2

%%bash
seq 5 | sed -n 'N;p'
1
2
3
4

N首先读取1\n2 -->打印模式空间 -->读取3\n4—>打印模式空间—>读取5行发现没有第6行—>失败

%%bash
seq 5 | sed  'n;p'
1
2
2
3
4
4
5

首先读取1到pattern space ,默认输出1,接着读取下一行2覆盖原来的1,p打印2,默认输出2

%%bash
seq 5 | sed  -n 'n;p'
2
4

首先读取1到pattern space ,抑制默认输出1,接着读取下一行2覆盖原来的1,p打印2,抑制默认输2

理解 x

%%bash
# seq 11 | sed -n 'x;p' == seq 11 | sed 'x'

seq 11 | sed 'x'
1
2
3
4
5
6
7
8
9
10

说明:模式空间的1<—>保持空间的空白行–>打印模式空间的空行,11并没有打印出来,因为他在保持空间中

%%bash
seq 4 | sed '/3/{x;p;x}'

seq 4 | sed -n '/3/{x;p;x}'
1
2

3
4

说明:当匹配到3的时候,执行交换,现在模式空间为空行,保持空间中为3,执行p命令显示模式空间中的空行,x再交换两这空间的内容,此是模式空间为3,默认模式空间的就会输出至标准屏幕,故3之前多了一个空行

%%bash
seq 4 | sed '/3/{x;p;x;d}'
1
2

4

说明:当第二个x交换回来,直接交给d执行,故3就没有了,只多了一条空行

理解h和H

!seq 4 | sed 'h;x'
1
2
3
4

说明:把模式空间中的内容覆盖到保持空间,再交换,再打印至标准输出

!seq 4 | sed 'x;h'

说明:先把模式空间的与保持空间交换,现在模式空间为空行,保持空间为1,然后再把模式空间覆盖保持空间,再输出至标准输出,故都为空行

理解G和g

!seq 4 | sed '/3/g'
1
2

4

说明:当匹配到3的时候,把保持空间的空行覆盖到模式空间,故就输出了空行

%%bash
seq 3 | sed  '1!G'
1
2

3

说明: 不是第1行就执行G操作,G是追加保持空间到模式空间,即为2+空行

!seq 3 | sed '1!G;h;$!d'
3
2
1

说明:当读到第一行时G不操作,然后把模式空间的内容覆盖到保持空间,然后删除模式空间,此时,保持空间为1,当读到第二行时,把保持空间的内容追加到模式空间,此时模式空间为2\n1,再执行h,把模式空间中的内容再覆盖到保持空间,此时保持空间为2\n1,删除模式空间,读取第3行时,把保持空间的内容追加到模式空间中,此时模式空间的为3\n\2\n1,最后一行不执行d操作

%%bash

echo 在原有的每行后方添加一个空白行
seq 3 | sed 'G' 
在原有的每行后方添加一个空白行
1

2

3
%%bash

echo 不是最后一行删除,取出最后一行
seq 3 |sed '$!d' 
不是最后一行删除,取出最后一行
3
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值