行编辑器 逐行编辑 主要适用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
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