Linux 文本处理工具 - sed(用于过滤和转换文本)
文章目录
- Linux 文本处理工具 - sed(用于过滤和转换文本)
-
- 一、简介
- 二、常用参数
- 三、动作说明
- 四、实例
-
- p 显示
- d 删除
- a 添加
- c 替换
- w 把符合的行写到指定文件中
- i 插入
- r 整合文件
- 字符替换
- 将更改保存到文件
- 为显示的内容添加行号
- 统计内容行数
一、简介
- sed 工作方式是按行处理的。
- Linux sed 命令是利用脚本来处理文本文件。
- sed 可依照脚本的指令来处理、编辑文本文件。
- sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
- 参考文章:https://www.runoob.com/linux/linux-comm-sed.html
- 官方文档:https://www.gnu.org/software/sed/manual/
二、常用参数
参数 |
说明 |
-e |
将命令添加到要在处理输入时运行的命令集中 |
-n |
仅显示 script 已处理的输入,已命令修改/删除的输入除外 |
-i |
就地编辑文件,并保存,对原文件不做备份 |
-iE |
更改文件并保存文件,对原文件做备份 (注意参数顺序,必须为 iE) |
三、动作说明
动作 |
说明 |
p |
打印 |
d |
删除 |
a |
添加 |
c |
替换 |
i |
插入 |
w |
把符合的行写到指定文件中 |
r |
整合文件 |
N |
将输入的下一行附加进来一起处理 |
= |
打印当前输入行号(行尾带有换行符) |
- 【注意】: 以上动作加 " -i " 参数后,会修改原文件。
- 【注意】:
- ’ s ’ 表示所有行,不写默认第一行.
- ’ g ’ 表示所有列,不写默认第一列.
- eg:
sed 's/root/####/g' test
四、实例
[root@ sed]
root:root
root:root
root:root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
ha:linux
root:redhat
file:dir
ha/linux
root/redhat
file/dir
[root@ sed]
p 显示
[root@ sed]
root
[root@ sed]
[root@ sed]
root
root
ROOT
[root@ sed]
[root@ sed]
root
ROOT
[root@ sed]
root
ROOT
[root@ sed]
[root@ sed]
roooot
rot
egegeg
egeg
[root@ sed]
- 显示 " test " 文件 以 " R " 开头的行
[root@ sed]
ROOT
[root@ sed]
- 显示 " test " 文件不是 " r " 开头的行
[root@ sed]
ROOT
egegeg
egeg
[root@ sed]
d 删除
[root@ sed]
root
root
root
ROOT
rot
egegeg
egeg
[root@ sed]
[root@ sed]
rot
egegeg
egeg
[root@ sed]
[root@ sed]
root
root
[root@ sed]
- 删除 " test " 文件中以 " r " 开头的行
[root@ sed]
ROOT
egegeg
egeg
[root@ sed]
- 删除 " test " 文件中带 " r " 的行
[root@ sed]
ROOT
egegeg
egeg
[root@ sed]
- 删除 " test " 文件中不是以 " e " 开头的行
[root@ sed]
egegeg
egeg
[root@ sed]
[root@ sed]
root
root
root
ROOT
[root@ sed]
a 添加
- 在 " test " 文件 第一行后插入一行 " hello world "
[root@ sed]
root
hello world
root
root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
root
hello world
root
root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
- 在 " test " 文件 最后一行后插入一行 "hello\n world ", 其中 " \n " 生效
[root@ sed]
root
root
root
ROOT
roooot
rot
egegeg
egeg
hello
world
[root@ sed]
- 在 " test "文件中 以 " r " 开头的行, 后面插入行 " hello world "
[root@ sed]
root
hello world
root
hello world
root
hello world
ROOT
roooot
hello world
rot
hello world
egegeg
egeg
[root@ sed]
- 在 " test " 文件第一到五行,每行后面添加 一行 "hello world"
[root@ sed]
root
hello world
root
hello world
root
hello world
ROOT
hello world
roooot
hello world
rot
egegeg
egeg
[root@ sed]
c 替换
- 替换 " test " 文件中以 " r " 开头的行 为 " hello world"
[root@ sed]
hello world
hello world
hello world
ROOT
hello world
hello world
egegeg
egeg
[root@ sed]
- 替换 " test " 文件中 第五行 为 " hello world "
[root@ sed]
root
root
root
ROOT
hello world
rot
egegeg
egeg
[root@ sed]
- 替换 " test " 文件中含 " root " 行 为 " hello world "
[root@ sed]
hello world
hello world
hello world
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
w 把符合的行写到指定文件中
- 将 " test " 文件中以 " r "开头的行 写到 " file " 文件
[root@ sed]
[root@ sed]
root
root
root
roooot
rot
[root@ sed]
- 将 " test " 文件中含 " root " 的行 写到 " file " 文件
[root@ sed]
[root@ sed]
root
root
root
[root@ sed]
i 插入
- 在 " test " 文件第三行插入 一行 " hello world ", 不会修改原文件
[root@ sed]
root
root
hello world
root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
r 整合文件
[root@ sed]
linux
centos
redhat
[root@ sed]
root:root
redhat:redhat
linux:linux
redhat:redhat
[root@ sed]
- 将 " file_r " 的文件内容插入到 " file1 "文件的 第二行后面, 不会修改原文件
[root@ sed]
root:root
redhat:redhat
linux
centos
redhat
linux:linux
redhat:redhat
[root@ sed]
字符替换
- [注意]:
- ’ s ’ 表示所有行,不写默认第一行.
- ’ g ’ 表示所有列,不写默认第一列.
- 测试文件
[root@ sed]
root:root
root:root
root:root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
ha:linux
root:redhat
file:dir
ha/linux
root/redhat
file/dir
[root@ sed]
- 替换 " test " 文件含 " root " 所有行所有列的 " root " 为 " #### "
[root@ sed]
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
- 替换 " test " 文件含 " root " 所有行的第一列的 " root " 为" ### "
[root@ sed]
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
- 替换 " test " 文件含 " root " 所有行第二列的 " root " 为 " #### "
[root@ sed]
root:
root:
root:
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
- 替换 " test " 文件 " root " 第一到三行的所有列的 " root " 为 " #### "
[root@ sed]
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
- 替换 " test " 文件 " root " 第一和三行的所有列的 " root " 为 " #### "
[root@ sed]
root:root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
- 替换 " test " 文件含 " ha " 和 含 " dir " 的 所有行所有列的 " : " 为 "####"
[root@ sed]
root:root
root:root
root:root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]
[root@ sed]
ha
root
file
ha/linux
root/redhat
file/dir
[root@ sed]
- 替换 " test " 文件的含 " / " 符号的所有行所有列的 " / " 为 “####” , 其中通过 " \ " 进行转义
[root@ sed]
ha:linux
root:redhat
file:dir
ha
root
file
[root@ sed]
- 替换 " test " 文件的含 " / " 符号的所有行所有列的 " / " 为 “####” , 其中通过 " @ " 符号代替 " / " 符号, 则不需要加转义符号 " \ "
[root@ sed]
ha:linux
root:redhat
file:dir
ha
root
file
[root@ sed]
将更改保存到文件
[root@ sed]
ha:linux
root:redhat
file:dir
ha/linux
root/redhat
file/dir
[root@ sed]
[root@ sed]
ha:linux
root:redhat
file:dir
ha
root
file
[root@ sed]
为显示的内容添加行号
- 为显示的内容添加行号
- sed ‘=’ test 为内容添加行号, 但是会在每行后面添加 换行
- sed ‘N;s/\n/ /g’ 将换行符 " \n " 替换为空格 " "
[root@ sed]
1 root:root
2 root:root
3 root:root
4 ROOT
5 roooot
6 rot
7 egegeg
8 egeg
[root@ sed]
统计内容行数
[root@ sed]
8
[root@ sed]