Linux 文本处理工具 - sed(用于过滤和转换文本)

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]# 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]#



你可能感兴趣的:(文本处理工具,linux,bash,vim)