Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2291733
  • 博文数量: 168
  • 博客积分: 6641
  • 博客等级: 准将
  • 技术积分: 1996
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-02 11:49
文章存档

2020年(4)

2019年(6)

2017年(1)

2016年(3)

2015年(3)

2014年(8)

2013年(2)

2012年(12)

2011年(19)

2010年(10)

2009年(3)

2008年(17)

2007年(80)

分类: LINUX

2011-06-25 01:41:17

 
sed文本处理常见用法
 
2011-06-24  TsengYia#126.com http://tsengyia.blog.chinaunix.net/
 
#################################################################
 
系统环境:
    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 '/\bsystem\b/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都删除(替换为空串)
sed 's/xml/&HTML/g' afile                 #//将文件中的所有xml都替换为xmlHTML,&代表前面的查找串
sed 's/^/#/' afile                        #//将每行开头插入一个#符号
sed 's/$/EOF/' afile                      #//将每行末尾添加EOF字符串
sed '/xml/s/^/#/' afile                   #//将包含xml的行的开头插入一个#符号
sed 's/\(AB\).*\(CDE\).*\(FG\)/\2\1\3/' afile    #//将AB...CDE...FG替换为CDE...AB...FG
                                          —— 其中的\1、\2、\3分别代表查找串中以括号\(、\)包围的第1、2、3个字符串
sed '3,5s/xml/XML/g' afile              #//将第3~5行中的所有xml替换为XML
sed '/xml/s/com/COM/g' afile             #//将包含xml的所有行中的com都替换为COM

sed '2cNewString' afile                   #//将第2行替换为Newtring
sed '2,5cLine1\nLine2' 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 '3aNewLine1\nNewLine2' 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
 
#################################################################
阅读(2155) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~