sed用法

sed : Stream Editor 流编辑器

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

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

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

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

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

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

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

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

动做说明code

  • 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 的行blog

[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
相关文章
相关标签/搜索