做好自己,不卑不亢,持之以恒!!
分类: 系统运维
2016-03-03 23:28:30
1.Sed简介:
Sed是一个很好的文件红醋栗工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据进行替换,删除,新增,选取等工作。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
Sed命令格式:
sed [-nefri] ‘command’ 输入文本
2.命令与选项:
sed命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址则处理所有的输入行。
2.1. Sed命令
命令 |
功能 |
a |
在当前行后添加一行或者多行,多行使用\n连接继续 |
c |
用此符号后的新文本替换当前行中的文本 |
i |
在当前行之前插入文本 |
d |
删除行 |
h |
把模式空间里的内容复制到暂存缓冲区 |
H |
把模式空间里的内容追加到暂存缓冲区 |
g |
把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容 |
G |
把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面 |
I |
列出非打印字符 |
p |
打印行 |
n |
读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理 |
q |
结束或退出sed |
r |
从文件中读取输入行 |
! |
对所选行以外的所有行应用命令 |
s |
用一个字符串替换另一个 |
g |
在行内进行全局替换 |
w |
将所选的行写入文件 |
x |
交换暂存缓冲区与模式空间的内容 |
y |
将字符替换为另一字符(不能对正则表达式使用y命令) |
2.2 sed选项:
选项 |
功能 |
-e |
进行多项编辑,即对输入行应用多条sed命令时使用 |
-n |
取消默认的输出 |
-f |
指定sed脚本的文件名 |
3: 退出状态
sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。
4:正则表达式元字符
元字符 |
功能 |
示例 |
^ |
行首定位符 |
/^#/匹配所有以”#”开头的行 |
$ |
行尾定位符 |
/s$/匹配所有以”s”结尾的行 |
* |
匹配零个或多个前导字符 |
/str*/匹配包含字母st,后跟零个或多个r字母的行 |
[] |
匹配不再指定字符组内的任一字符 |
/[st]r/匹配包含sr或tr的行 |
[^] |
匹配不再指定字符组内的任一字符 |
[^st]r匹配包含r,但r前的那个字符不是s也不是t |
& |
保存查找串以便在替换串中引用 |
s/str/**&**/ 符号&代表串,str将被替换为**str** |
\< |
词首定位符 |
/\ |
\> |
词尾定义符 |
/\>ing/匹配以ing结尾的单词的行 |
x\{n\} |
连续n个x |
/x\{3\}/ 匹配包含连续3个x的行 |
X\{n,\} |
至少n个x |
/x\{3,\}/ 匹配包含至少连续3个x的行 |
X\{m,n\} |
至少m个,但不超过n个x |
/x\{5,7\}/ 匹配包含连续5到7个x的行 |
举例:(以test文件为例)
删除某行:
# sed '1d' test #删除第一行
# sed '$d' test #删除最后一行
# sed '1,2d' test #删除第一行和最后一行
# sed '2,$d' test #删除第二行到最后一行
# sed '/Hello/,/end/d' test #删除包含”Hello”的行到包含“end”的行之间的行
# sed '/Hello/,4d' test #删除包含“Hello”的行到第十行的内容
显示某行:
# sed -n '1p' test #显示第一行
# sed -n '$p' test #显示最后一行
# sed -n '1,2p' test #显示第一行和第二行
# sed -n '2,$p' test #显示第二行到最后一行
使用模式进行查询:
# sed -n '/hello/p' test #查询关键字hello所在的所有行
# sed -n '/\$/p' test #查询包括关键字$所在所有行,使用反斜线\转义特殊字符
增加一行或者多行字符串:
# cat test
Hello
Welcom to learn linux
end
# sed '1a add a string' test #第一行后增加字符串”add a string”
Hello
add a string
Welcom to learn linux
end
# sed '1,3a add another string' test #第一行到第三行后增加字符串‘add another string’
Hello
add another string
Welcom to learn linux
add another string
end
add another string
# sed '1a the other\nstring' test #第一行后增加多行,使用换行符\n
Hello
the other
string
Welcom to learn linux
end
替换一行中的某部分:
# sed -n '/Hello/p' test | sed 's/Hello/HELLO/g' test #替换Hello为HELLO
# sed -n '/Hello/p' test | sed 's/Hello//g' test #删除Hello
# sed -i '$a bye' test #在文件最后一行直接输入“bye”
# cat test
Hello
Welcom to learn linux
end
bye
# sed 's#My#Your#g' test
#紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符、反斜线除外),只要紧跟s命令,就成了新的串分隔符。