Linux处理文本的第二驾马车—sed命令

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 :增删改查

aappend,在指定行的后增加一行,内容为 a 的后面接的字串
iinsert,在指定行的前增加一行,内容为 i 的后面接的字串
ddelete,删除某一行或者某几行,也可以指定删除匹配上的行
cchange,改变指定行的内容
s 更改或替换字符串,使用格式为 's/pattern/new/[flags]', 把pattern替换成new,默认只替换一个,可以指定flags (没有指定flag就默认替换第一处,如果flag为g,全局替换。)
y 转换,实现字符一对一转换,格式 ‘y/abc/ABC/'
pprint,把匹配或修改过的行打印出来,通常与–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
1a在第一行后增加内容

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
1,2i表示在第一行和第二行前面分别增加内容

结合-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
sed命令-e与分别2i和2a一起增加内容

2.sed命令除文本内容

d:删除某一行或者某几行

########d∶delete,删除某一行或者某几行,也可以指定删除匹配上的行 
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed '1,3d'
##删除第1到第3行
sed删除文本内容的例子

删除空白行

########删除空白行
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt  | sed '/^$/d'
###用关键词去匹配地址,^代表行首,$代表行尾,行首和行尾接在一起就是一行空白行。注意事项,有时候一行只有一个空格符,虽然看起来是空白行,但是有一个空格在,就不是空白行,也就不会被识别。
sed删除空白行

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'
sed命令修改文本内容

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,全部替换
sed命令替换示例

以上的这张截图自己做的注释不清晰,补充和示例如下:

说明:'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,全部替换
sed命令与s参数以及指定flag替换

y:转换,实现字符一对一转换(修改)

##y∶转换,实现字符一对一转换(修改),格式 ‘y/abc/ABC/' 
cat readme.txt
##查看原文件,对比后面操作
cat readme.txt | sed 'y/abcde/ABCDE/'
###一个个字符对应修改,所有的都替换,不像s需要指定flags
sed命令y替换示例

指定路径替换

###指定路径或是地址来替换
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结合,打印出匹配的行,不匹配的行就不会被打印(显示)出来
-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

查看sed的帮助文档

或是网页搜索:https://linux.die.net/man/1/sed

说明:

以上内容主要是跟着生信技能树的教学视频和课件内容学习做的笔记,小郭老师讲得很详细,举一反三,方便记忆和理解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容