sed(流编辑器)是最早支持正则表达式的工具之一,至今仍然用于文本处理,特别是用于替换命令https://zh.wikipedia.org/wiki/Sed。一般用来对文本进行增删改查。
Sed用的比较多的不是流编辑器,而是文本处理的功能:增、删、改、查四个功能。
sed功能强大,有自己的语法,相当于一门编程。
sed常见参数
-n :禁止显示所有输入内容,只显示经过sed处理的行(常用)
-e :直接在命令模式上进行 sed 的动作编辑,接要执行的一个或 者多个命令(和grep命令里的-e参数一样)
-f :执行含有 sed 动作的文件(当代码部分很长时,把那些代码指定到一个文件,用-f指定这个文件,用得少)
-r :sed 的动作支持的扩展正则(默认基础正则)
-i :直接修改读取的文件内容,不输出(grep命令里的-i是忽略大小写)。
sed常见用法
sed
[-options]
script
file(s)
[-options]:在options前面加-
表示可以省略,'script'有自己的一套语法
script代码部分的构成: [address][!]
command
address
为定位地址,处理哪几行;
!
表示否定,如果address
是第1行,1!
是不处理第一行以外的其它行;
command
:命令或是代码。
- 常见 'script' address
2
: 第 2 行
2,4
: 第2行到第4行
2,$
: 第 2 行到最后一行,$ 表示最后
2~3
: 从第 2 行开始,每隔 3 行取一行2、5、8
2,+4
: 从第 2 行到 2+4 行
/pattern/
:匹配上 pattern 的行(pattern 为关键词)
[!]
: 表示否定,取反:'2 !' 表示除了第二行
- 常见 'script' command :增删改查
a
:append,在指定行的后增加一行,内容为 a 的后面接的字串
i
:insert,在指定行的前增加一行,内容为 i 的后面接的字串
d
:delete,删除某一行或者某几行,也可以指定删除匹配上的行
c
:change,改变指定行的内容
s
: 更改或替换字符串,使用格式为 's/pattern/new/[flags]', 把pattern替换成new,默认只替换一个,可以指定flags (没有指定flag就默认替换第一处,如果flag为g,全局替换。)
y
: 转换,实现字符一对一转换,格式 ‘y/abc/ABC/'
p
:print,把匹配或修改过的行打印出来,通常与–n参数合用(查的功能,类似于grep搜索的功能)
sed文本处理常用的四个功能使用示例及详解
1.sed命令给文本增
加内容
a:在指定行的后增加一行
########a∶append,在指定行的后增加一行,内容为 a 的后面接的字串
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed '1a There are something I want you to know'
##在第1行的最后加There are something I want you to know
i:在指定行的前增加一行
########i∶insert,在指定行的前增加一行,内容为 i 的后面接的字串
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed '1,2i Let us start our journey'
##在1到2行前面分别增加 Let us start our journey
结合-e参数使用:可以执行多个命令
########-e :直接在命令模式上进行 sed 的动作编辑,接要执行的一个或 者多个命令
cat readme.txt
cat readme.txt | sed -e '2i I have something to let you know' -e '2a We will be with you during a long journey'
##2i,在第二行的前面加I have something to let you know;2a第二行的后面加We will be with you during a long journey
2.sed命令删
除文本内容
d:删除某一行或者某几行
########d∶delete,删除某一行或者某几行,也可以指定删除匹配上的行
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed '1,3d'
##删除第1到第3行
删除空白行
########删除空白行
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed '/^$/d'
###用关键词去匹配地址,^代表行首,$代表行尾,行首和行尾接在一起就是一行空白行。注意事项,有时候一行只有一个空格符,虽然看起来是空白行,但是有一个空格在,就不是空白行,也就不会被识别。
3.sed命令修改
文本内容
c:改变指定行的内容
########c∶change,改变指定行的内容(改的是整行的内容)
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed '2,4c *********'
##把2到4行的内容删除,2到4只用*********替代
##如何把2到4行,每行都变为*********,用-e同时操作
cat readme.txt | sed -e '2,4i *********' -e '2,4d'
s:更改或替换字符串
########s∶更改或替换字符串,使用格式为 's/pattern/new/[flags]', 把pattern替换成new,(如果没有flags)默认只替换一个,可以指定flags ,([flags]指定第几处,如果替换第一处,就放1,如果flags里是g,代表全局替换)
#(区别s和y,s里的pattern是整个字符串替换,y是字符转换)
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed 's/is/IS/'
###flag没有指定的数字,默认为只改每一行的第一处
cat readme.txt | sed 's/is/IS/2'
###flag指定为2处理每一行的第二处
cat readme.txt | sed 's/is/IS/g'
##flag指定为g,全部替换
以上的这张截图自己做的注释不清晰,补充和示例如下:
说明:'s/is/IS/'处理每一行的第一处,'s/is/IS/2'处理每一行的第二处,'s/is/IS/g'处理全部
's/pattern/new/[flags]'
###自己创建一个tmp.txt,用来操作,加强理解
cat tmp.txt
##查看原文件,对比后面操作
cat tmp.txt | sed 's/is/IS/'
###flag没有指定的数字,默认为只改每一行的第一处
cat tmp.txt | sed 's/is/IS/2'
###flag指定为2处理每一行的第二处
tmp.txt | sed 's/is/IS/g'
##flag指定为g,全部替换
y:转换,实现字符一对一转换(修改)
##y∶转换,实现字符一对一转换(修改),格式 ‘y/abc/ABC/'
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed 'y/abcde/ABCDE/'
###一个个字符对应修改,所有的都替换,不像s需要指定flags
指定路径替换
###指定路径或是地址来替换
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed '1s/ee/EE/'
##指定对第1行进行操作,1s之间加空格最好,1空格s:1 s
cat readme.txt | sed '1~3s/ee/EE/'
##从第1行开始,每隔3行,即1,4,7行,1~3s和第3行没关(自己刚开始不理解)
##第4行:Please fEEl free to contact with me( email to jmzeng1314@163.com )
##只处理第一处,即原来的feel被处理,free(第二处)没有被处理,指定flag为2或是g
指定地址(关键词)替换
###匹配模式还可以用匹配地址来替换
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed '/www/ s/ee/EE/'
##匹配关键词
4.sed命令查
看文本内容
p:把匹配或修改过的行打印出来通常与–n参数合用(查)
###-n :禁止显示所有输入内容,只显示经过sed处理的行(常用)
##p∶print,把匹配或修改过的行打印出来,通常与–n参数合用(查)
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | grep 'ee'
###grep命令里用的,对比
cat readme.txt | sed -n '/ee/p'
##-n只显示匹配处理的行,p就是打印的意思,-p和-n结合,打印出匹配的行,不匹配的行就不会被打印(显示)出来
grep,sed,awk三驾马车都是按一行行的顺序来处理文本。
练习题 :
1. 使用 head 查看 example.gtf 文件
head Data/example.gtf |less -s
2. 将 1 的结果传递给 sed ,并将 HAVANA 替换为 ENSEMBL
head Data/example.gtf | sed 's/HAVANA/ENSEMBL/' |less -S
##改的是一整行就用c命令,如果改的是一个字符就用y命令
3. 使用head查看 example.fa 文件,结果传递给 sed , 取第2行之后的互补序列,并保存到新文件中
head Data/example.fa
head Data/example.fa | sed '2,$ y/ATCG/TAGC/'
##注意理解两点,第二行之后,就是第2行到最后一行,需要用到$符号;取的是互补序列ATCG分别的互补TAGC,之后查看前后几个碱基,看是否匹配上。
cat | head Data/example.fa | sed '2,$ y/ATCG/TAGC/'>Exa.fa
##保存到新文件Exa.fa中
4. 搜索一下,sed 如何做大小写转换
首先到网上搜索,
cat readme.txt | sed 's/[a-z]/\u&/g'
##第一次尝试,把所有的字母都变成大写
##多去试试
补充知识:
-i#参数
sed 's/[a-z]/\u&/g' readme.txt
sed -i 's/[a-z]/\u&/g' readme.txt
##-i的作用是把修改后的结果写到文件里,不打印到屏幕里,没有提示过程
cat readme.txt
##文件已经被修改过了。
##注意:如果一旦修改了,发现不对就不好搞整,所以原始文件不要轻易修改
rm#命令
#一旦把文件删了就很难恢复,建议初学者先不要用rm这个方法
#可以用mv这个命令
mkdir
mv readme.txt tmp/
ls tmp/
##这个方法非常适合初学者去用
##可以把不要的文件或是文本都移到一个tmp文件,定期一个星期或是一个月再去清理
需要了解sed其它参数的用法在Linux里搜索帮助文档:man sed
或是网页搜索:https://linux.die.net/man/1/sed
说明:
以上内容主要是跟着生信技能树的教学视频和课件内容学习做的笔记,小郭老师讲得很详细,举一反三,方便记忆和理解。