Linux 文本处理工具 - sed(用于过滤和转换文本)
Linux 文本处理工具 - sed(用于过滤和转换文本)文章目录Linux 文本处理工具 - sed(用于过滤和转换文本)简介常用参数动作说明实例简介sed 工作方式是按行处理的。Linux sed 命令是利用脚本来处理文本文件。sed 可依照脚本的指令来处理、编辑文本文件。sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。参考文章:https://www.runoo
·
Linux 文本处理工具 - sed(用于过滤和转换文本)
文章目录
一、简介
- 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]# cat test
root:root
root:root
root:root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]# cat file
ha:linux
root:redhat
file:dir
ha/linux
root/redhat
file/dir
[root@ sed]#
p 显示
- 显示 " test " 文件第二行
[root@ sed]# sed -n 2p test
root
[root@ sed]#
- 显示 " test " 文件第二行到第四行
[root@ sed]# sed -n 2,4p test
root
root
ROOT
[root@ sed]#
- 显示 " test " 文件第二行和第四行
[root@ sed]# sed -n "2p;4p" test
root
ROOT
[root@ sed]# sed -ne "2p;4p" test
root
ROOT
[root@ sed]#
- 显示 " test " 文件第5行到最后一行
[root@ sed]# sed -ne '5,$p' test
roooot
rot
egegeg
egeg
[root@ sed]#
- 显示 " test " 文件 以 " R " 开头的行
[root@ sed]# sed -n '/^R/p' test
ROOT
[root@ sed]#
- 显示 " test " 文件不是 " r " 开头的行
[root@ sed]# sed -n '/^r/!p' test
ROOT
egegeg
egeg
[root@ sed]#
d 删除
- 删除 " test " 文件中的第5行
[root@ sed]# sed 5d test
root
root
root
ROOT
rot
egegeg
egeg
[root@ sed]#
- 删除 " test " 文件第一行到第五行
[root@ sed]# sed '1,5d' test
rot
egegeg
egeg
[root@ sed]#
- 删除 " test " 文件中 第三行到最后一行
[root@ sed]# sed '3,$d' test
root
root
[root@ sed]#
- 删除 " test " 文件中以 " r " 开头的行
[root@ sed]# sed '/^r/d' test
ROOT
egegeg
egeg
[root@ sed]#
- 删除 " test " 文件中带 " r " 的行
[root@ sed]# sed '/r/d' test
ROOT
egegeg
egeg
[root@ sed]#
- 删除 " test " 文件中不是以 " e " 开头的行
[root@ sed]# sed '/^e/!d' test
egegeg
egeg
[root@ sed]#
- 删除 " test " 文件中第五行到最后一行
[root@ sed]# sed -e '5,$d' test
root
root
root
ROOT
[root@ sed]#
a 添加
- 在 " test " 文件 第一行后插入一行 " hello world "
[root@ sed]# sed '1a hello world' test
root
hello world
root
root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]# sed -e '1a hello world' test
root
hello world
root
root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]#
- 在 " test " 文件 最后一行后插入一行 "hello\n world ", 其中 " \n " 生效
[root@ sed]# sed -e '$a hello\n world' test
root
root
root
ROOT
roooot
rot
egegeg
egeg
hello
world
[root@ sed]#
- 在 " test "文件中 以 " r " 开头的行, 后面插入行 " hello world "
[root@ sed]# sed -e '/^r/a hello world' test
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]# sed -e '1,5a hello world' test
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]# sed -e '/^r/c hello world' test
hello world
hello world
hello world
ROOT
hello world
hello world
egegeg
egeg
[root@ sed]#
- 替换 " test " 文件中 第五行 为 " hello world "
[root@ sed]# sed -e '5c hello world' test
root
root
root
ROOT
hello world
rot
egegeg
egeg
[root@ sed]#
- 替换 " test " 文件中含 " root " 行 为 " hello world "
[root@ sed]# sed -e '/root/c hello world' test
hello world
hello world
hello world
ROOT
roooot
rot
egegeg
egeg
[root@ sed]#
w 把符合的行写到指定文件中
- 将 " test " 文件中以 " r "开头的行 写到 " file " 文件
[root@ sed]# sed -ne '/^r/w file' test
[root@ sed]# cat file
root
root
root
roooot
rot
[root@ sed]#
- 将 " test " 文件中含 " root " 的行 写到 " file " 文件
[root@ sed]# sed -ne '/root/w file' test
[root@ sed]# cat file
root
root
root
[root@ sed]#
i 插入
- 在 " test " 文件第三行插入 一行 " hello world ", 不会修改原文件
[root@ sed]# sed '3i hello world' test
root
root
hello world
root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]#
r 整合文件
- 测试文件
[root@ sed]# cat file_r
linux
centos
redhat
[root@ sed]# cat file1
root:root
redhat:redhat
linux:linux
redhat:redhat
[root@ sed]#
- 将 " file_r " 的文件内容插入到 " file1 "文件的 第二行后面, 不会修改原文件
[root@ sed]# sed "2r file_r" file1
root:root
redhat:redhat
linux
centos
redhat
linux:linux
redhat:redhat
[root@ sed]#
字符替换
- [注意]:
- ’ s ’ 表示所有行,不写默认第一行.
- ’ g ’ 表示所有列,不写默认第一列.
- 测试文件
[root@ sed]# cat test
root:root
root:root
root:root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]# cat file
ha:linux
root:redhat
file:dir
ha/linux
root/redhat
file/dir
[root@ sed]#
- 替换 " test " 文件含 " root " 所有行所有列的 " root " 为 " #### "
[root@ sed]# sed 's/root/####/g' test
####:####
####:####
####:####
ROOT
roooot
rot
egegeg
egeg
[root@ sed]#
- 替换 " test " 文件含 " root " 所有行的第一列的 " root " 为" ### "
[root@ sed]# sed 's/root/###/' test
###:root
###:root
###:root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]#
- 替换 " test " 文件含 " root " 所有行第二列的 " root " 为 " #### "
[root@ sed]# sed 's/root/####/2g' test
root:####
root:####
root:####
ROOT
roooot
rot
egegeg
egeg
[root@ sed]#
- 替换 " test " 文件 " root " 第一到三行的所有列的 " root " 为 " #### "
[root@ sed]# sed '1,3s/root/####/g' test
####:####
####:####
####:####
ROOT
roooot
rot
egegeg
egeg
[root@ sed]#
- 替换 " test " 文件 " root " 第一和三行的所有列的 " root " 为 " #### "
[root@ sed]# sed '1s/root/####/g;3s/root/####/g' test
####:####
root:root
####:####
ROOT
roooot
rot
egegeg
egeg
[root@ sed]#
- 替换 " test " 文件含 " ha " 和 含 " dir " 的 所有行所有列的 " : " 为 "####"
- 测试文件
[root@ sed]# sed '/ha/,/dir/s/:/####/g' test
root:root
root:root
root:root
ROOT
roooot
rot
egegeg
egeg
[root@ sed]#
- 替换
[root@ sed]# sed '/ha/,/dir/s/:/####/g' file
ha####linux
root####redhat
file####dir
ha/linux
root/redhat
file/dir
[root@ sed]#
- 替换 " test " 文件的含 " / " 符号的所有行所有列的 " / " 为 “####” , 其中通过 " \ " 进行转义
[root@ sed]# sed 's/\//####/g' file
ha:linux
root:redhat
file:dir
ha####linux
root####redhat
file####dir
[root@ sed]#
- 替换 " test " 文件的含 " / " 符号的所有行所有列的 " / " 为 “####” , 其中通过 " @ " 符号代替 " / " 符号, 则不需要加转义符号 " \ "
[root@ sed]# sed 's@/@####@g' file
ha:linux
root:redhat
file:dir
ha####linux
root####redhat
file####dir
[root@ sed]#
将更改保存到文件
- 通过 " -i " 参数将修改原文件, 并保存
[root@ sed]# cat file
ha:linux
root:redhat
file:dir
ha/linux
root/redhat
file/dir
[root@ sed]# sed 's@/@####@g' file -i
[root@ sed]# cat file
ha:linux
root:redhat
file:dir
ha####linux
root####redhat
file####dir
[root@ sed]#
为显示的内容添加行号
- 为显示的内容添加行号
- sed ‘=’ test 为内容添加行号, 但是会在每行后面添加 换行
- sed ‘N;s/\n/ /g’ 将换行符 " \n " 替换为空格 " "
[root@ sed]# sed '=' test | sed 'N;s/\n/ /g'
1 root:root
2 root:root
3 root:root
4 ROOT
5 roooot
6 rot
7 egegeg
8 egeg
[root@ sed]#
统计内容行数
- 打印最后行号, 可用这来统一文件内容行数
[root@ sed]# sed -n '$=' test
8
[root@ sed]#
更多推荐
已为社区贡献1条内容
所有评论(0)