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) |