目录
概述
- grep,sed和awk就是三个操纵文本文件的命令
- grep搜索
- sed 修改和编辑文本文件中某些行
- awk 是访问文本文件,操纵文本文件中某些数据
sed命令的基本用法
sed编程的一组例子
-
sed 的 –n 选项:不打印sed 编辑对象的全部文本内容
命令 p 实现匹配行的功能。
-
sed打印3到6行
sed –n ‘3,6p’ input
-
/pattern/ 进行模式匹配:打印匹配 hahahaha 关键字的行,注意大小写敏感
sed –n ‘/hahahaha/p’ input
-
sed 的 –e选项:表示下一个字符串解析为sed的编辑命令
如打印匹配 hahahaha 关键字的行号 和 行:
sed –n –e ‘/hahahaha/=’ –e ‘/hahahaha/p’ input
注意:
- sed 的 –f 选项:调用sed 脚本文件
a\:用于追加文本,如在关键字“file:”匹配行后加一行“append a new line”
sed ‘/file:/a\append a new line’ input
注意:sed并不改变源文件,只是将结果输出到标准输出上。
一个 sed 脚本的例子:append.sed 文件
#!/bin/sed –f
/file:/a\
append a new line.\ # \ 是因为有多行需要添加,该符号表示换行
append a new line more.
执行:添加执行权限
./append.sed input
sed 文本定位的一组例子
- 匹配原字符,用转义符“\”
sed -n ‘/\./p’ input #匹配符号 . 的行的命令
sed –n ‘/\$/p’ input #匹配符号 $ 的行的命令
- 使用元字符进行匹配
sed –n ‘$p’ input #打印最后一行,“$”在sed中表示最后一行,“p”既可以在单引号内也可在外
sed –n ‘$’p input
sed –n ‘/.*bus/p’ input # 打印含有以bus 结尾的字符串的行
- !符号:x,y! 表示匹配不在x和y行号范围内的行
sed –n ‘2,10!p’ input # 打印不在2~10范围内的行
- 使用行号与关键字匹配限定行范围
sed –n ‘/string/,$p’ input # 打印关键字 string 行到最后一行
sed 基本编辑命令的一组例子
- 插入文本:
i\ 命令:在匹配行之前插入文本
sed ‘/file:/i\This is a new line’ input # 在file: 匹配行的前一行插入 This is a new line
- 修改文本:
c\命令:将所匹配的文本行用新文本替代
sed ‘/file:/c\This is a modified line’ input
- 删除文本:
d命令:删除匹配行
sed ‘100d’ input # 删除第100行
sed ‘$d’ input # 删除最后一行
sed ‘1,100d’ input # 删除1到100行
- 替换文本:替换文本可以替换一个字符串
s命令:s/被替换字符串/新字符串/[替换选项]
-
sed ‘s/Certificate/CERTIFICATE/p’ input #替换文本中匹配Certificate行中第一处的Certificate为CERTIFICATE
-
sed ‘s/Certificate/CERTIFICATE/pg’ input #替换文本中匹配Certificate行中所有的Certificate为CERTIFICATE
-
注意:sed还可以替换文本中第几次匹配的关键字,只需在前面加上相应的数字(范围为1~512之间)
如:前面有9次出现关键字Certificate,则第10次的会被换掉
sed ‘s/Certificate/CERTIFICATE/10p’ input #替换文本中第10次匹配Certificate关键字为CERTIFICATE
- 输出到文件:如替换文本中匹配Certificate行中第一处的Certificate为CERTIFICATE 并输出到output文件
sed -n ‘s/Certificate/CERTIFICATE/w output’ input
-
&符号:用来保存被替换的字符串以供调用
sed -n ‘s/AA/(&)/pg’ input 等价于
sed –n ‘s/AA/(AA)/pg’ input
- 使用精确匹配 \<\> 替换:
122:23:334
12:23:34
6:12:23
9:3:34
12:23:334
替换为:
122:023:334
012:023:334
012:023:034
006:012:023
009:003:034
012:023:334
命令为:sed 's/\<[0-9]\>/0&/g' 1 | sed 's/\<[0-9][0-9]\>/0&/g'
- 写入一个新文件
sed –n ‘1,5 w output’ input #将1~5行写入output文件
sed –n ‘/hahaha/w output’ input #将匹配hahaha的行写入output文件
- 从文本中读入文本
r命令:在指定行后添加文本文件内容
sed ‘/Certificate/r otherfile’ input #在匹配行后添加otherfile文本
-
退出命令
q命令:
sed ‘5 q’ input #打印前5行后退出
sed –n ‘/.r.*/p’ inout #打印第一次匹配的行就退出
- .变换命令
y命令:sed ‘y/被变换的字符序列/变换的字符序列/’ 输入文件 (两字符序列要求等长)
sed ‘y/12345/ABCDE/’ input #1->A,2->B,3->C,4->D,5->E变换
-
显示控制字符
sed l:控制字符即非打印字符
sed –n ‘1,$l’ file #显示file中控制字符
- 定位行执行命令组
sed编辑命令中的 {} 符号可以指定在定位行上所执行的命令组。
sed –n –e ‘Certificate/p’ –e ‘/Certificate/=’ input 等价于
sed –n ‘/Certificate/{p;=}’ input
在与Certificate关键字匹配的行将全部的i替换为I,将第一个le替换为99
sed ‘/Certificate/{s/i/I/g;s/le/99/;}’ input
sed 高级编辑命令的一组例子
- 处理匹配行的下一行
n命令:读取下一个输入行。如:将Certificate匹配的行的下一行中的 ll 替换为 99 写法为
sed ‘/Certificate/{n;s/ll/99/;}’ input
- sed 缓冲区的处理
h, H; g, G
- 利用分号分隔多个编辑命令
sed ‘编辑命令1; 编辑命令2; ……’ 输入文件