设为首页收藏本站
开启辅助访问
切换到窄版

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1600|回复: 4

sed文本处理常见用法

[复制链接]
发表于 2013-2-24 12:38:24 | 显示全部楼层 |阅读模式
sed文本处理常见用法

2011-06-24  TsengYia#126.com http://selinux.cublog.cn/

#################################################################

系统环境:
    RHEL 6.0 [2.6.32-71.el6.i686]

软件环境:
    sed-4.2.1-5.el6.i686

#################################################################

一、基本格式

sed -e '编辑指令' 文件1,文件2,文件3,……           #//过滤并输出内容
sed -n -e '编辑指令' 文件1 文件2 文件3,……        #//只输出需要处理的行
sed -i -e '编辑指令' 文件1 文件2 文件3,……        #//直接修改文件内容,而不是输出过滤结果

    —— 只有一个编辑指令时,-e选项一般可以省略。
    编辑指令的格式:
        [地址1[,地址2]]操作函数[参数]

    —— 使用多个编辑指令时,可设置多个-e选项。
    sed -e '编辑指令1' -e '编辑指令2' 文件
    相当于
    sed -e '编辑指令1' 文件 ; sed -e '编辑指令2' 文件


二、应用举例

1. 输出符合条件的文本(p,正常输出;l,以ASCII码输出非打印字符,其余与p相同)

sed -n 'p' afile                          #//输出所有行,等同于cat afile
sed -n '3p' afile                         #//输出第3行
sed -n '3l' afile                         #//输出第3行,其中非打印字符以ASCII码表示
sed -n '3,5p' afile                       #//输出第3~5行
sed -n 'p;n' afile                        #//输出所有的奇数行,n表示读入下一行文本
sed -n 'n;p' afile                        #//输出所有的偶数行,n表示读入下一行文本
sed -n '1,5{p;n}' afile                   #//输出第1~5行之间间的所有奇数行(第1、3、5行)
sed -n '10,${n;p}' afile                  #//输出第10行至文件尾之间的所有偶数行

sed -n '/xml/p' afile                     #//输出包含xml的行,正则表达式以“/”包围
sed -n '4,/xml/p' afile                   #//输出从第4行至第一个包含xml的行
sed -n '/xml/=' afile                     #//输出包含xml的行所在的行号,=用来表示行号
sed -n '/^install/p' afile                #//输出以install开头的行
sed -n '/noarch$/p' afile                 #//输出以noarch结尾的行
sed -n '$p' afile                         #//输出最后一行
sed -n '//p' afile              #//输出包含独立单词system的行,< 与 > 用来界定单词
sed -n '/bsystemb/p' afile              #//输出包含独立单词system的行,b 用来界定单词

2. 删除符合条件的文本(d,删除内容)

sed '3d' afile                            #//删除第3行
sed '3,5d' afile                          #//删除第3~5行
sed '/xml/d' afile                        #//删除包含xml的行
sed '/xml/!d' afile                       #//删除不包含xml的行,!符号表示操作取反
sed '/^install/d' afile                   #//删除以install开头的行
sed '/noarch$/d' afile                    #//删除以noarch结尾的行、
sed '$d' afile                            #//删除最后一行
sed '/^$/d' afile                         #//删除所有的空行
sed '/^$/{n;/^$/d}' afile                 #//删除重复的空行,连续多个空行只保留一个,效果同cat -s afile
                                          —— n表示读下一行文本,/^$/d表示如果仍然是空行则删除

3. 替换符合条件的文本(s,字符串替换;c,整行或多行替换;y,单个字符转换)

sed 's/xml/XML/' afile                    #//将每行中的第一个xml替换为XML,
                                          —— 替换操作中分隔符“/”也可改为其他字符,如#等
sed 's/xml/XML/3' afile                   #//将每行中的第3个xml替换为XML
sed 's/xml/XML/g' afile                   #//将文件中的所有xml都替换为XML
sed 's/xml//g' afile                      #//将文件中的所有xml都删除(替换为空串),效果同cat afile  tr -d 'xml'
sed 's/xml/&HTML/g' afile                 #//将文件中的所有xml都替换为xmlHTML,&代表前面的查找串
sed 's/^/#/' afile                        #//将每行开头插入一个#符号
sed 's/$/EOF/' afile                      #//将每行末尾添加EOF字符串
sed 's/xml/^/#/ afile                     #//将包含xml的行的开头插入一个#符号
sed 's/(AB).*(CDE).*(FG)/213/' afile    #//将AB...CDE...FG替换为CDE...AB...FG
                                          —— 其中的1、2、3分别代表查找串中以括号(、)包围的第1、2、3个字符串
sed 's/3,5s/xml/XML/g' afile              #//将第3~5行中的所有xml替换为XML
sed 's/xml/s/com/COM/g' afile             #//将包含xml的所有行中的com都替换为COM

sed '2cNewString' afile                   #//将第2行替换为Newtring
sed '2,5cLine1nLine2' afile              #//将第2~5行替换为两行,即Line1和Line2,其中的n表示换行
sed 'y/abcd/ABCD/' afile                  #//将文件中的a、b、c、d字符转换为大写
sed '1,5y/abcd/ABCD/' afile               #//将第1~5行中的a、b、c、d字符转换为大写
sed '/xml/y/com/COM/' afile               #//将包含xml的行中的c、o、m字符都转换为大写


4. 迁移符合条件的文本(H,追加复制到剪贴板;g、G,将剪贴板中的文本覆盖/追加到指定行;w,保存为文件;r,读取指定文件;a,追加指定内容)

sed '/xml/{H;d};$G' afile                 #//将包含xml的行迁移至文件末尾,;用来分隔多个操作
sed '/1,10{H;d};20G' afile                #//将第1~10行迁移至第20行后
sed '/xml/w out.file' afile               #//将包含xml的行另存为文件out.file
sed '/xml/r host.conf' afile              #//将文件host.con的内容添加到包含xml的每一行之后

sed '3aNewLine' afile                     #//在第3行之后插入一个新行,内容为NewLine
sed '3aNewLine1nNewLine2' afile          #//在第3行之后插入两个新行,内容分别为NewLine1、NewLine2
sed '/xml/aNewLine' afile                 #//在包含xml的每一行之后插入一个新行,内容为NewLine


三、使用sed脚本
    将多个编辑指令存放到文件中(每行一条编辑指令),通过-f选项来调用。
    例如以下操作 —— :
sed '/1,10{H;d};20G' afile                #//将第1~10行迁移至第20行后

    可以改用sed脚本文件的方式 —— :
[root@localhost ~]# vi opt.list
1,10H
1,10d
20G
[root@localhost ~]# sed -f opt.list afile

#################################################################
发表于 2013-4-1 09:02:04 | 显示全部楼层
很好的东西!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|手机版|Archiver|生物信息学论坛 ( 蜀ICP备09031721号  

GMT+8, 2017-3-30 05:01 , Processed in 0.186247 second(s), 21 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表