先举个例子

-i
: 选项,表示直接修改原文件;
/^>/!
: 位置参数,/^>/
表示以>
开头的行,!
表示取反;
s/B/X/g
: 子命令,把所有的B替换为X。
sed
就是如此,一行一行读取,对特定的位置进行操作。
1. 选项
-n
: 取消默认输出
-i
: 直接修改原文件
-e
: 允许执行多个子命令
2. 位置参数
可以按行号 和 / 或 正则表达式匹配,正则表达式用写到
//
里。没有位置参数的话,即匹配所有。
1
: 第1
行
$
: 最后一行
x,y
: 第 x
行到第 y
行,如1,5
表示第 1
行到第 5
行
first~step
: 指定起始行和步长,如 0~2
表示偶数行,1~2
表示奇数行
x,+n
: 指定某行后面的几行,如 2,+5
等同于 2,7
/chr/
: 含字符 chr
的行
/^$/
: 空白行
/chr2/,5
: 含字符 chr2
的行到第 5
行
关于正则匹配,只举了几个例子,所以还是搞懂正则啊。
3. 常见子命令
许多命令都很强大,但不需要完全掌握,也完全掌握不了......太真实了,55555
p
: 打印匹配行(和 -n
选项一起合用)
d
: 删除定位行
i
: 在匹配行的前方插入文本
a
: 在匹配行的后方插入文本
s
: 替换
y
: 字符转换
q
: 第一个模式匹配完成后退出
{}
: 在定位行执行的命令组,用分号隔开
w filename
: 将匹配地址的所有行输出到指定的文件中
4. 进一步理解
Linux文本处理三剑客之sed 中有一个很好的例子,里面还给出了两个学习 sed
的网站。
$ zcat 1_SD_30_1.fq.gz | sed -n '1~4s/^@/>/p;2~4p' | sed 's/ .*//' | head -n 5
>ERR569754.4
CAGCATCACATATTAGGCTTTATCCCTTTAAAGCAATATATTTTGAAATATCAATTATCATTTTCATTTATGGCCCGTAGGGCATTGCAGGGCACAACG
>ERR569754.7
TGCTGTTCATGGTGTTGTTGCTCTTGCTGTTGTTGTTGTTGCCCACGATGGGATCGCCGTTGATGGGGCCGTTAACGGGATTGCCATGAATCTTGGTGT
>ERR569754.18
注意替换标志
p
表示替换第一个符合规则的字符串,并打印;w filename
表示替换第一个符合规则的字符串,并输出到文件filename
中;另外还有g
表示全局替换;十进制数字:替换文本行中第 n 个符合规则的字符串;空:替换文本行中的第1个符合规则的字符串。
$ sed '/^>/! y/ATCG/atcg/' genome.fa
>chr1
attcatagccaatttagcc
>chr2
gatcagcagtttatt
...
类似于
tr
命令。
$ sed -n -e '/>chr/w chr.txt' -e '/>chr/!w sequence.txt' genome.fa
$ cat chr.txt
>chr1
>chr2
>chr3
>chr10
>chr11
$ cat sequence.txt
ATTCATAGCCAATTTAGCC
GATCAGCAGTTTATT
GGCAAGTTACGGC
TTTCAGCCAG
CCATAA
w
实现了 id 和序列的快速分离。
别人写的很全,http://lnmp.ailinux.net/sed
网友评论