文本三剑客:
grep :过滤行内容
awk :过滤字段
sed :过滤行内容,修改行内容
sed编辑器
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed的工作流程主要包括读取、执行和显示三个过程
- 读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间)
- 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
- 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直到所有内容被处理完
sed命令格式
sed -e '操作' 文件1 文件2
sed -n -e '操作' 文件1 文件2
sed -f 脚本文件 文件1 文件2
sed -i -e '操作' 文件1 文件2
常用选项
| 选项 | 作用 |
|---|---|
| -e | 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
| -f | 表示用指定的脚本文件来处理输入的文本文件 |
| -h | 显示帮助 |
| -n | 禁止sed编辑器输出,但可以与p命令一起使用完成输出 |
| -i | 直接修改目标文本文件 |
常用操作
| 操作 | 作用 |
|---|---|
| s | 替换,替换指定字符 |
| d | 删除,删除选定的行 |
| a | 增加,在当前行下方增加一行指定内容 |
| i | 插入,在选定行上方插入一行指定内容 |
| c | 替换,将选定行替换为指定内容 |
| y | 字符转换,转换前后的字符长度必须相同 |
| p | 打印行内容。如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用 |
| = | 打印行号 |
| l | 打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t) |
sed 打印
sed -e "p" 每行内容打印两次
sed -n "p" 每行内容只打印一次
'n' 打印行号
sed -n '=' 只打印行号
sed -e '=' 打印行号和行内容
sed -n '=;p' 打印行号和行内容
sed对指定行进行操作
以数字形式表示行区间
| 操作 | 含义 |
|---|---|
| '1p' | 打印第一行 |
| '$p' | 打印最后一行 |
| '1,3p' | 打印连续行,打印第一行到第三行 |
| '6,$p' | 打印第六行到最后一行 |
| '1,+3p' | 打印第一行加后面三行(即打印第一到第四行) |
| '5q' | 打印前五行后退出 |
| 'p;n' | 打印奇数行 |
| 'n;p' | 打印偶数行 |
使用字符串匹配出行
| 操作 | 含义 |
|---|---|
| '/root/p' | 打印包含root的行 |
| '/root/!p' | 打印不包含root的行。! 表示取反 |
| '/^root/p' | 打印以root开头的行 |
| '/bash$/' | 打印以bash结尾的行 |
| '/root l bash/p' | 打印包含root或bash的行。"l"是扩展正则表达式的元字符,要使用sed -r |
| '6,/root/p' | 打印第6行到第一个包含root的行 |
使用sed输出奇数行或者偶数行
使用正则表达式匹配行内容
sed 删除
以数字形式表示行区间
删除空行并保存
sed 修改替换
s:替换字符串
c:整行替换
y:字符替换,替换前后的字符串长度必须相同
格式:
sed -n s/旧字符串/新字符串/替换标记