• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

rookieeee

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

sed用法

sed : Stream Editor 流编辑器

行编辑器 逐行编辑 主要适用shell 脚本

逐行将内容加载到内存进行修改,处理的结果发送到显示器上。不改变原文件内容 如需要修改原文件内容,需要添加 -i 参数
sed命令格式

sed [option选项] scripts脚本 file文件名
sed [option] ‘AddressCommand地址(文件里的那哪些行进行处理)命令(增 删改查)’ file
Address(地址)表示方法

option选项:
-n:不再显示模式空间的内容
-i:直接修改原文件
-e:同时执行多个匹配操作
可以同时使用多个条件

-f:将多个AddresCommand保存到文件中,每行一个AddresCommand;读取该文件中的操作同时执行多个操作。

-r:表示使用扩展正则表达式

1、StartLine起始行号,EndLine结束行号
  100 一到一百行进行处理
     1,$ 从第一行到最后一行进行处理

2、LineNumber
  3  明确指定行号
3、StarLine,+n
  5+2 对567这三行进行处理 /root/,2找到带有root的行以及他的后两行
4、/正则表达式/
  /root/在文件里找到带有root的行
  /bash$/在文件里找到以bash结尾行
5、/正则表达式1/,/正则表达式2/
  第一次被正则表达式1匹配的行,到正则表达式2匹配的行,取他们中间的所有行。包括他们本身。

动作说明:

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

p(显示):

打印文件 /etc/fstab 中含有字符串 UUID 的行

[root@linuxprobe ~]# sed -n '/UUID/p' /etc/fstab
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2

 

 $p,读入最后一行时打印模式空间的第一行

打印文件 /etc/fstab 中以 UUID 结尾的行

sed -n '/UUID$/p' /etc/fstab

打印文件 /etc/fstab 中以 UUID 开头的行

[root@linuxprobe ~]# sed -n '/^UUID/p' /etc/fstab
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2

打印文件 /etc/fstab 含有:号的行

[root@linuxprobe ~]# sed -n '/\:/p' /etc/fstab 
# Created by anaconda on Sun Dec  1 20:06:57 2019

 

打印文件 /etc/fstab 中的空行

[root@linuxprobe ~]# sed -n '/^$/p' /etc/fstab 

打印文件 /etc/fstab 中 2到6 行

[root@linuxprobe ~]# sed -n '2,6p' /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'

打印文件 /etc/fstab 中 除了 2到6 行之外的其他行

[root@linuxprobe ~]# sed -n '2,6!p' /etc/fstab 

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

 

a(添加)

找出文件 /etc/fstab 中以 UUID 开头的行,并在其下一行添加单行字符串(追加到指定行后)

[root@linuxprobe ~]# sed '/^UUID/a\hello sed' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2
hello sed
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

 

找出文件 /etc/fstab 中以 UUID 开头的行,并在其下一行添加多行字符串

[root@linuxprobe ~]# sed '/^UUID/a\hello sed\nhello sed' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2
hello sed
hello sed
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

在文件 /etc/fstab 中指定第五行的下一行添加字符串

[root@linuxprobe ~]# sed '5a\hello word' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
hello word
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

 

在文件 /etc/fstab 中指定第一行、第五行的下一行分别添加字符串

[root@linuxprobe ~]# sed -e '1a\hello word' -e '5a\helloword' /etc/fstab 

hello word
#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
helloword
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

d(删除)

  带有0-9的行删除:

[root@linuxprobe ~]# sed '/[0-9]/d' /etc/fstab 

#
# /etc/fstab
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
#

 显示文件 /etc/fstab 在 模式空间删除 含有 UUID 字符串的行

 

[root@linuxprobe ~]# sed '/UUID/d' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

显示文件 /etc/fstab 在 模式空间删除除了以 UUID 开头之外的行后的内容

 

[root@linuxprobe ~]# sed '/^UUID/!d' /etc/fstab 
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2

显示文件 /etc/fstab 在 模式空间删除 空行 后的内容

[root@linuxprobe ~]# sed '/^$/d' /etc/fstab 
#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

 

 显示文件 /etc/fstab 在 模式空间 删除 1到4行后的内容

[root@linuxprobe ~]# sed '1,4d' /etc/fstab 
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

 

w(写入) 

将文件 /etc/fstab 中以 UUID 开头的行指定输出(重定向)到 /tmp/fstab.txt 且不显示到屏幕

[root@linuxprobe ~]# sed -n '/^UUID/w /tmp/fstab.txt' /etc/fstab 

 

 c(更改)

将 /etc/fstab 中含有字符串 UUID 的行替换为 hello world

[root@linuxprobe ~]# sed '/^UUID/c\hello world' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
hello world
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

将 /etc/fstab 中含有字符串以 UUID 开头的行替换为两行内容:hello world 与 hello sed

[root@linuxprobe ~]# sed '/^UUID/c\hello world\nhello sed' /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
hello world
hello sed
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

 

i(插入) 

找出文件 /etc/fstab 中以 UUID 开头的行,并在其上一行添加单行字符串(插入指定行)

[root@linuxprobe ~]# sed '/^UUID/i\hello world' /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
hello world
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

 

s(替换)

s/old/new/ [修饰符]
old:正则表达式

只替换每一行第一次出现的匹配对象,如果需要全部替换,则需要添加g

s/// 三个斜线可以替换成任意相同符号 例如 s@@@
把替换的内容写成空,就可以删除全局指定对象

每行替换第一个指定字符串

sed ‘s/要被替代的字符串/新的字符串/’ (斜杠为定界符)

 

将每行第一个 / 转为 $ (反斜杠为转义字符即 \ / 相当于 / )

[root@linuxprobe ~]# sed 's/\//$/' /etc/fstab 

#
# $etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '$dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and$or blkid(8) for more info
#
$dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e $boot                   xfs     defaults,uquota       1 2
$dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
$dev/cdrom    /mnt    iso9660    defaults    0    0

 

全文替换所有指定字符串

sed ‘s/要被取代的字符串/新的字符串/g’ (斜杠为定界符,g 对模式空间指定情况的全局更改)

 

将所有的 / 转为 $ (反斜杠为转义字符即 \ / 相当于 / )

[root@linuxprobe ~]# sed 's/\//$/g' /etc/fstab 

#
# $etc$fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '$dev$disk'
# See man pages fstab(5), findfs(8), mount(8) and$or blkid(8) for more info
#
$dev$mapper$rhel_linuxprobe-root $                       xfs     defaults        1 1
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e $boot                   xfs     defaults,uquota       1 2
$dev$mapper$rhel_linuxprobe-swap swap                    swap    defaults        0 0
$dev$cdrom    $mnt    iso9660    defaults    0    0

 

# 删除每行前两个字符
$ sed 's/..//' tmp.txt
#删除后两个字母
sed 's/..$//'

显示类的操作都要加 -n 不再显示模式空间的内容
sed -i i直接把结果反馈给原文件 谨慎使用

   $P,读入最后一行时打印模式空间的第一行

$P,读入最后一行时打印模式空间的第一行

[root@linuxprobe ~]# sed -n '$p' /etc/passwd
never:x:1004:1004::/home/never:/bin/bash
打印文件中的行号

打印指定行号(模式空间中的指定行),如以 UUID 开头的行(行号显示在其上一行)

 

[root@linuxprobe ~]# sed '/^UUID/='  /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sun Dec  1 20:06:57 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel_linuxprobe-root /                       xfs     defaults        1 1
10
UUID=be2ca297-f7b1-49ac-b4b0-762d54380b1e /boot                   xfs     defaults,uquota       1 2
/dev/mapper/rhel_linuxprobe-swap swap                    swap    defaults        0 0
/dev/cdrom    /mnt    iso9660    defaults    0    0

 

 打印文件的总行数

[root@linuxprobe ~]# sed -n '$=' /etc/fstab 
12

 

posted on 2020-04-03 22:28  rookieeee  阅读(245)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3