Linux学习

来源:互联网 发布:修改软件的版本号 编辑:程序博客网 时间:2024/06/05 18:35

欢迎关注生信宝典:http://mp.weixin.qq.com/s/cywkIeRbhkYTZvkwTeIVSA

sed基本参数解释

sed是stream editor的简称,擅长对文件进行各种正则操作、插入操作、替换操作和删除操作,可以全局,可以指定特定范围的行或者特定特征的行。

s/pat/replace/: 正则替换

前插行i, 后插行a, 替换行c, 删除行d, 输出行p

N: 读入下一行,同时存储;n:读入下一行,抛弃当前行

常见操作

  • 替换特定的文本
ct@ehbio:~/SXBD$ cat matID  2 cell  4 cell  8 cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5Tet1_3  2   3   4   5ct@ehbio:~/SXBD$ sed 's/ /_/' mat ID  2_cell  4 cell  8 cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5Tet1_3  2   3   4   5ct@ehbio:~/SXBD$ sed 's/ /_/g' mat ID  2_cell  4_cell  8_cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5Tet1_3  2   3   4   5
  • 获得逗号分隔的一组数
ct@ehbio:~/SXBD$ echo `seq 1 10` | sed 's/ /,/g'1,2,3,4,5,6,7,8,9,10
  • 针对指定行替换
ct@ehbio:~/SXBD$ sed '2,$ s/_[0-9]//g' mat ID  2 cell  4 cell  8 cell  embryoPou5f1  2   3   4   5Nanog   2   3.2 4.3 5c-Myc   2   3   4   5Tet1    2   3   4   5
  • 替换特定出现位置
# 替换第一个空格ct@ehbio:~/SXBD$ sed 's/ /_/1' mat ID  2_cell  4 cell  8 cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5Tet1_3  2   3   4   5# 替换第二个空格ct@ehbio:~/SXBD$ sed 's/ /_/2' mat ID  2 cell  4_cell  8 cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5Tet1_3  2   3   4   5# 替换第二个及以后的空格ct@ehbio:~/SXBD$ sed 's/ /_/2g' mat ID  2 cell  4_cell  8_cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5Tet1_3  2   3   4   5
  • 给序列起名字
ct@ehbio:~/SXBD$ cat seqACDGTFGGCATGCDTGDACDGAGCDTAGCDGTACAGDTAGDCTADTGct@ehbio:~/SXBD$ sed = seq1ACDGTFGGCATGCDTGD2ACDGAGCDTAGCDGTA3CAGDTAGDCTADTG# 同时缓冲两行,但只对第一行行首操作ct@ehbio:~/SXBD$ sed = seq | sed 'N;s/^/>/;'>1ACDGTFGGCATGCDTGD>2ACDGAGCDTAGCDGTA>3CAGDTAGDCTADTG
  • 给文件增加标题行
ct@ehbio:~/SXBD$ tail -n +2 mat | sort -k2,2nc-Myc   2   3   4   5Nanog_1 2   3.2 4.3 5Pou5f1_1    2   3   4   5Tet1_3  2   3   4   5# 1 表示第一行# i 表示插入,在指定行前面插入新行ct@ehbio:~/SXBD$ tail -n +2 mat | sort -k2,2n | sed '1 i ID\t2_cell\t4_cell\t8_cell\tembryo'ID  2_cell  4_cell  8_cell  embryoc-Myc   2   3   4   5Nanog_1 2   3.2 4.3 5Pou5f1_1    2   3   4   5Tet1_3  2   3   4   5
  • 提取特定或指定范围的行
# -n是必须的,阻止程序自动输出匹配行,不然会导致重复输出ct@ehbio:~/SXBD$ sed -n '2,4p' matPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5ct@ehbio:~/SXBD$ sed -n '4p' matc-Myc   2   3   4   5
  • 提取符合特定模式的行
ct@ehbio:~/SXBD$ sed -n '/_/ p' matPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5Tet1_3  2   3   4   5ct@ehbio:~/SXBD$ sed -n '/-/ p' matc-Myc   2   3   4   5
  • 去除文件中的空行
ct@ehbio:~/SXBD$ cat matID  2 cell  4 cell  8 cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5Tet1_3  2   3   4   5# 空行就是只有行首和行尾的行ct@ehbio:~/SXBD$ sed '/^$/d' mat ID  2 cell  4 cell  8 cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5Tet1_3  2   3   4   5
  • 原位删除
ct@ehbio:~/SXBD$ cat matID  2 cell  4 cell  8 cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5Tet1_3  2   3   4   5# -i 参数的使用ct@ehbio:~/SXBD$ sed -i '/^$/d' mat ct@ehbio:~/SXBD$ cat matID  2 cell  4 cell  8 cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc   2   3   4   5Tet1_3  2   3   4   5
  • 删除指定范围的行
ct@ehbio:~/SXBD$ cat matID  2 cell  4 cell  8 cell  embryoPou5f1_1    2   3   4   5Nanog_1 2   3.2 4.3 5c-Myc_2 2   3   4   5Tet1_3  2   3   4   5ct@ehbio:~/SXBD$ sed '2,3d' matID  2 cell  4 cell  8 cell  embryoc-Myc_2 2   3   4   5Tet1_3  2   3   4   5
  • 记忆匹配

\(\)启动记忆匹配;\1为第一个匹配项,\2为第二个匹配项;匹配项的计数根据左括号出现的位置来定,第一个(包括起来的为\1

ct@ehbio:~/SXBD$ echo "hah ehbio hah" | sed 's/ \(.*\) /\t\1\t\1\t/'hah ehbio   ehbio   hah
  • 奇偶数行处理
ct@ehbio:~/SXBD$ echo -e "odd\neven\nodd\neven"oddevenoddeven# 奇偶数行合并ct@ehbio:~/SXBD$ echo -e "odd\neven\nodd\neven" | sed 'N;s/\n/\t/'odd evenodd even# 取出偶数行,比较简单# 注意 n (小写)撇掉了奇数行ct@ehbio:~/SXBD$ echo -e "odd\neven\nodd\neven" | sed -n 'n;p'eveneven# 取出奇数行# 先都读进去,然后替换偶数行为空值,再输出ct@ehbio:~/SXBD$ echo -e "odd\neven\nodd\neven" | sed -n 'N;s/\n.*//;p'oddodd
  • Windows/Linux换行符困境

Windows下的换行符是\r\n, Linux下换行符是\n, MAC下换行符是\r。所以Windows下的文件拷贝到Linux后,常会出现行尾多一个^M符号的情况,从而引起匹配或其它解析问题。

^M的输是 ctrl+v+M ctrl+v;ctrl+m,不是简单的输入^,再输入M

ct@ehbio:~/SXBD$ cat -A windows.txt ID^M$A^M$B^M$C^M$ct@ehbio:~/SXBD$ sed 's/^M//' windows.txt | cat -AID$A$B$C$
  • sed中使用bash变量
# 注意双引号的使用ct@ehbio:~/SXBD$ bash_variable='ehbio'ct@ehbio:~/SXBD$ echo "sheng xin bao dan " | sed "s/$/$bash_variable/"sheng xin bao dan ehbio

正则表达式不同语言略有差别,但整体相近,更多正则操作见:不用Linux也可以的强大文本处理方法。

原创粉丝点击