sed是一个流编辑器(stream editor),它适合将一系列编辑命令作用于文本文件,sed大概有以下用法
格式:
1在shell中调用sed [选项] ‘sed命令’ 输入文件
2将sed命令插入到脚本后,通过sed命调用它,其实就是把引号中的内容写到一个文本文件中
3独立作为脚本文件sed脚本需要一sha-bang文件开头,即第一行为#!/bin/sed –f
Sed有命令和编辑命令。
命令
-n 不打印所有的行的标准输出(只输出选定的行,也可能是内容,也可能是行号,具体要看编辑命令
-e表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,-e可以省略
-f表示正在调用sed脚本文件
-i :可以直接操作原文件。默认情况下sed不会改变原文件,但是-i选项可以修改原文件,此选项应慎用。
-r:可以使用标准正则表达式。默认情况下sed只支持基本正则表达式,但是加上-r选项后则支持扩展正则表达式
Sed编辑命:
P/p打印匹配行
=打印文件行号
a\在定位行号之前插入信息
i\在定位行号之后插入信息
d删除定位行
c\用新文本替代定位文本
s使用替换模式替换相应模式
sed 's#My#Your#g' datafile
#紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符、反斜线除外),只要紧跟s命令,就成了新的串分隔符。
y命令 该命令与UNIX/Linux中的tr命令类似,字符按照一对一的方式从左到右进行转换。例如,y/abc/ABC/将把所有小写的a转换成A,小写的b转换成B,小写的c转换成C。
r从另一个文件中都文本
w将文本写入到一个文件
{}在定位行执行的命令组
n读取下一个输入行,用下一个命令处理新的行
g将保存到缓冲区的内容复制到模式缓冲区
还有h H x G命令。。。。。
例1 删除2-5行nl /etc/passwd | sed '2,5d'
例2 这样就能把包含704的行号和内容都打印出来
sed -n -e'/704/p' -e '/704/=' filename
例3 显示1-3行
sed '3q' filename
例4 显示3到最后一行
sed -n '3,$p' filename
例5 不包含abc,将123改为456
sed '/abc/!s/123/456/g' urfile
当为g时,每一行中的所有匹配值全部替换,没有g时,默认替换每行中的第一个
例6 删除包含"My"的行到包含"You"的行之间的行
sed '/My/,/You/d' datafile
例7 交换匹配顺序
sed 's/\(12\)\(.*\)\(56\)/\3\2\1/g' filename
将每行中12,56字符前后位置替换:如 123456 变为563412
sed 正则表达式
元字符 | 功能 | 示例 |
^ | 行首定位符 | /^my/ 匹配所有以my开头的行 |
$ | 行尾定位符 | /my$/ 匹配所有以my结尾的行 |
. | 匹配除换行符以外的单个字符 | /m..y/ 匹配包含字母m,后跟两个任意字符,再跟字母y的行 |
* | 匹配零个或多个前导字符 | /my*/ 匹配包含字母m,后跟零个或多个y字母的行 |
[] | 匹配指定字符组内的任一字符 | /[Mm]y/ 匹配包含My或my的行 |
[^] | 匹配不在指定字符组内的任一字符 | /[^Mm]y/ 匹配包含y,但y之前的那个字符不是M或m的行 |
\(..\) | 保存已匹配的字符 | 1,20s/\(you\)self/\1r/ 标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第 20行进行处理,you被保存为标签1,如果发现youself,则替换为your。 |
& | 保存查找串以便在替换my中引用 | s/my/**&**/ 符号&代表查找串。my将被替换为**my** |
\< | 词首定位符 | /\<my/ 匹配包含以my开头的单词的行 |
\> | 词尾定位符 | /my\>/ 匹配包含以my结尾的单词的行 |
x\{m\} | 连续m个x | /9\{5\}/ 匹配包含连续5个9的行 |
x\{m,\} | 至少m个x | /9\{5,\}/ 匹配包含至少连续5个9的行 |
x\{m,n\} | 至少m个,但不超过n个x | /9\{5,7\}/ 匹配包含连续5到7个9的行 |
sed 高级用法
。。。