sed(流编辑器)是一种非交互式文本处理工具,基于预设规则逐行处理数据流(文件或管道输入)。它将当前行存入模式空间,按命令处理后输出到标准输出,不修改原始文件。
sed [options] 'script' [file1 file2...]
选项 |
描述 |
---|---|
-e script |
显式指定编辑命令(可多条,用分号分隔) |
-f file |
从文件读取编辑命令 |
-n |
禁止默认输出,需配合p 等命令手动输出,默认就是改了也输出,不改原样输出 |
选项 | 正则表达式类型 | 支持的元字符 | 示例 |
---|---|---|---|
无 -r |
基本正则表达式 | ^ 、$ 、. 、* 、[] 、\( \) 、| (需转义) |
sed 's/[0-9]*/num/' |
-r |
扩展正则表达式 | 所有基本元字符 + 、? 、() 、| 、{} (无需转义) |
sed -r 's/[0-9]+/num/' |
echo "This is a test" | sed 's/test/big test/'
# 输出:This is a big test
1、无-e直接分号分隔
[root@free ~]# sed -e 's/brown/green/; s/dog/cat/' data1.txt
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
[root@free ~]# cat data1.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
2、有-e直接空格分隔
[root@free ~]# sed -e 's/brown/green/' -e 's/dog/cat/' data1.txt
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
3、还可以换行输入
[root@free ~]# sed -e '
s/brown/green/
s/dog/cat/
' data1.txt
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
[root@free ~]# sed '{
> s/brown/green/
> s/dog/cat/
> }' data1.txt
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat.
The quick green fox jumps over the lazy cat
语法:
注意:不管后面有没有新加参数都一定要分隔符(一般为/,但是分隔符可以自己定义,改为其他的也行)结尾
s/pattern/replace/[flags]
flags
替换标记:
标记 | 描述 | 示例 |
---|---|---|
数字 | 替换第n 处匹配 |
s/test/trial/2 :替换第 2 个test |
g |
全局替换所有匹配项 | s/test/trial/g :替换所有test |
p |
打印匹配行(需-n ) |
sed -n 's/test/trial/p' data.txt |
w file |
将结果写入文件 | sed 's/test/trial/w output.txt' data.txt |
替换分隔符:
当模式含/
时,可用其他字符(如!
)替代分隔符:
sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd
2s/dog/cat/
(修改第 2 行);2,3d
(删除第 2-3 行);2,$s/old/new/
($
代表末行)。sed -n '/redhat/s/bash/csh/p' /etc/passwd # 仅处理含"redhat"的行
sed '2{
> s/fox/elephant/
> s/dog/cat/
> }' data1.txt # 对第2行执行两条替换命令
sed '3d' data4.txt # 删除第3行
sed '/number 1/d' data4.txt # 删除含"number 1"的行
sed '/1/,/3/d' data4.txt # 删除包含"1"和"3"的行区间
[root@free ~]# sed '3i/hellow' data1.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
/hellow
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
[root@free ~]# sed '3i\hellow' data1.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
hellow
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
[root@free ~]# sed '3a\hellow' data1.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
hellow
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
[root@free ~]# sed '$a\hellow' data1.txt
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
The quick brown fox jumps over the lazy dog.
hellow
data4.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
sed '3c\This is a changed line.' data4.txt # 修改第3行
sed '/number 3/c\This is a changed line.' data4.txt
data5.txt
This is line number 1.
This is line number 2.
This is line number 3.
This is line number 4.
This is line number 1 again.
This is text you want to keep.
This is the last line in the file.
sed 'y/123/789/' data5.txt # 将"1"→"7","2"→"8","3"→"9"
p
命令:打印匹配行(需-n
) sed -n '/number 3/p' data4.txt
=
命令:打印行号 sed '=' data1.txt # 输出行号与内容
[root@free ~]# sed '=' data1.txt
1
The quick brown fox jumps over the lazy dog.
2
The quick brown fox jumps over the lazy dog.
3
The quick brown fox jumps over the lazy dog.
4
The quick brown fox jumps over the lazy dog.
5
The quick brown fox jumps over the lazy dog.
l
命令:打印行及不可见字符(如制表符\t
)[root@free ~]# cat data6.txt
This line contains tabs.
sed -n 'l' data6.txt
[root@free ~]# sed -n 'l' data6.txt
This line contains tabs.$
sed '1,2w test.txt' data4.txt # 将前两行写入test.txt
sed '3r data8.txt' data4.txt # 在第3行后插入data8.txt内容
把/etc/passwd 复制到/root/test.txt,用sed打印所有行;
sed -n '1,$p' test.txt
sed '/bash/d' test.txt
sed 's#/sbin/nologin#/bin/login#' test.txt
echo "/etc/sysconfig/network-scripts/" | sed -r 's#^/(.*)/(.*)/#\1#' # 提取目录名
echo "/etc/sysconfig/network-scripts/" |sed -r 's#^/(.*)/(.*)/#\2#' #提取基名
.*是贪婪匹配,一直以匹配到最长,除非像以上后面还是字符限制
如果只要取第一个目录名:
[root@free ~]# echo "/etc/sysconfig/network-scripts/" | sed -r 's#^/([a-z]+)/(.*)/#\1#'
etc
()定义捕获组,\1是将匹配到的内容替换为第一个捕获组所匹配到的内容
提取目录名还能用dirname
dirname /etc/httpd/conf.d/host.conf
基名能用basename
basename /etc/httpd/conf.d/host.conf
ifconfig | sed -n '2p' | sed -r "s/.*inet[[:space:]]*//; s/[[:space:]]*netmask.*//"
这是先取出第二行,然后将不需要的部分替换为空
第二种方法
[root@free ~]# ifconfig | sed -rn 's/.*inet ([0-9.]+).*/\1/p'
192.168.153.135
127.0.0.1
定义捕获组为ipv4的格式,也可以使用更具体的匹配格式
[root@free ~]# ifconfig | sed -rn 's/.*inet ([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}).*/\1/p'
192.168.153.135
127.0.0.1
如果想要去掉回环地址
[root@free ~]# ifconfig | sed -rn 's/.*inet ([0-9.]+).*/\1/p' | grep -v '^127'
192.168.153.135
-v去掉满足要求的
sed '20,$s/^.*$/aaa:&/g' test.txt
^.*$:正则表达式,匹配整行内容(^行首,.*任意字符,$行尾)。
aaa:&:替换文本,&是sed的特殊变量,表示匹配的内容(即整行)。
7.复制/etc/grub2.cfg到/root/grub2.cfg,删除文件中所有以空白开头的行行首的空白字符;
sed 's/^\s*//' /etc/grub2.cfg
\s通常可以用来表示空白字符
sed 's/^[[:space:]]//' grub2.cfg
8.关闭selinux功能
就是用-i将文件直接修改
将SELINUX=.*替换为SELINUX=disabled
它配置文件有将3种不同形式列出来
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
[root@free ~]# cat /etc/selinux/config
....
SELINUX=enforcing
....
[root@free ~]# sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
[root@free ~]# cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX=disabled
# SELINUX=disabled
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
# See also:
# https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/using_selinux/changing-selinux-states-and-modes_using-selinux#changing-selinux-modes-at-boot-time_changing-selinux-states-and-modes
#
# NOTE: Up to RHEL 8 release included, SELINUX=disabled
# NOTE: Up to RHEL 8 release included, SELINUX=disabled
# fully disable SELinux during boot. If you need a system with SELinux
# fully disabled instead of SELinux running with no policy loaded, you
# need to pass selinux=0 to the kernel command line. You can use grubby
# to persistently set the bootloader to boot with selinux=0:
#
# grubby --update-kernel ALL --args selinux=0
#
# To revert back to SELinux enabled:
#
# grubby --update-kernel ALL --remove-args selinux
#
SELINUX=disabled
SELINUX=disabled
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
修改完配置文件后要将虚拟机重启才能生效,reboot
getenforce可以查看selinux状态