评论

收藏

[Unix] sed编辑器

服务系统 服务系统 发布于:2021-12-26 12:45 | 阅读数:277 | 评论:0

sed编辑器
sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。
sed 的工作流程主要包括读取、执行和显示三个过程:

  • 读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space) 。
  • 执行:默认情况下, 所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址, 否则sed命令将会在所有的行上依次执行。
  • 显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
命令格式
sed -e '操作' 文件1 文件2 ...
sed -n -e '操作' 文件1 文件2 ...
sed -f 脚本文件 文件1 文件2 ...
sed -i -e '操作' 文件1 文件2 ...
执行多个操作:
sed -e 'n{
操作1
操作2
...
}' 文件1 文件2 ...
常用选项
常用选项介绍-e或--expression表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用-f或--file表示用指定的脚本文件来处理输入的文本文件-h或--help显示帮助-n、--quiet 或silent禁止sed编辑器输出,但可以与p命令一起使用完成输出-i直接修改目标文件(使用前最好做验证或备份)常用操作
常用操作含义介绍s替换替换指定字符d删除删除选定的行i插入在选定行上面增加一行指定内容a增加在当前行下面增加一行指定内容c替换行将选定行替换为指定内容y字符转换转换前后的字符长度必须相同(需要满足对应关系)p打印如果同时指定行,表示打印指定行;<br>如果不指定行,则表示打印所有内容;<br>如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用。=打印行号l(小写L)打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)多条命令打印内容的方法
[root@localhost ~]# sed -n -e '=' -e 'p' one.sh 
1
one
2
two
3
three
4
four
5
five
[root@localhost ~]# sed -n '=;p' one.sh     
1
one
2
two
3
three
4
four
5
five
[root@localhost ~]# sed -n '
> =
> p
> ' one.sh
1
one
2
two
3
three
4
four
5
five
使用地址
sed编辑器有两种寻址方式
1.以数字形式表示行区间
2.用文本模式来过滤出行
[root@localhost ~]# sed -n '1p' one.sh #打印第一行内容
one
[root@localhost ~]# sed -n '$p' one.sh #打印最后一行的内容
five
[root@localhost ~]# sed -n '1,3p' one.sh #打印1~3行的内容
one
two
three
[root@localhost ~]# sed -n '3,$p' one.sh #打印第3行到最后一行的内容
three
four
five
[root@localhost ~]# sed -n '1,+3p' one.sh #打印1之后的连续3行,即1~4行
one
two
three
four
[root@localhost ~]# sed '5q' one.sh #打印前5行信息后退出,q表示退出
one
two
three
four
five
[root@localhost ~]# 
[root@localhost ~]# sed -n 'p;n' one.sh #打印奇数行
one
three
five
[root@localhost ~]# sed -n 'n;p' one.sh #打印偶数行
two
four
[root@localhost ~]# sed -n '2,${n;p}' one.sh 
three
five
#从第二行开读取到最后一行,但是碰到n就是直接移动到下一行遇到p打印,开始读取形成了循环,以此类推打印奇数行
[root@localhost ~]# sed -n 'p;n;p' one.sh 
one
two
three
four
five
[root@localhost ~]# sed -n 'n;p;n' one.sh 
two
five
#简单来说n是不打印p是打印,循环就是npnnp,所以2和5就打印出来了
[root@localhost ~]# sed -n '/root/p' /etc/passwd #打印/etc/passwd中带有root的行用两个斜杠把你要查找的表达式或者字符串括起来
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# sed -n '/^root/p' /etc/passwd #打印/etc/passwd中开头的root的行
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# sed -n '/\/bin\/bash/p' /etc/passwd #如果有斜杠的内容可以用反斜杠来转义
root:x:0:0:root:/root:/bin/bash
linux-5:x:1000:1000:Linux-5:/home/linux-5:/bin/bash
[root@localhost ~]# sed -nr '/ro+t/p' /etc/passwd #加"r"与反斜杠效果一样
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# sed -n -e '3,/games/p' /etc/passwd #打印从第三行到第一个出现games的行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
删除行
sed 'd' 文件名 #全删
sed '3d' 文件名 #删除第3行
sed '1d;$d' 文件名 #删除第一行与最后一行
去除空行:
grep -v "^$" 文件名
cat 文件名 | tr -s "\n"
sed '/^$/d' 文件名 #加i执行
sed '/nologin$/!d' /etc/passwd #删除/etc/passwd中除了nologin结尾以外所有的行
sed '/2/,/3/d' 文件名 #从第一个位置打开行删除功能,到第二个位置关闭行删除功能
替换
行范围 s/旧字符串/新字符串/替换标记
4种替换标记:
数字:表明新字符串将替换第几处匹配的地方
g:表明新字符串将会替换所有匹配的地方
p:打印与替换命令匹配的行,与-n一起使用
w 文件:将替换的结果写到文件中
[root@localhost ~]# sed -n 's/root/admin/p' /etc/passwd #把/etc/passwd中的第一个root替换为admin
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
[root@localhost ~]# sed -n 's/root/admin/2p' /etc/passwd #把/etc/passwd中的第二个root替换
root:x:0:0:admin:/root:/bin/bash
[root@localhost ~]# sed -n 's/root/admin/gp' /etc/passwd #把/etc/passwd中的root全部替换
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
使用替换把井号进行删除:
[root@localhost ~]# cat one.sh 
one
#two
#three
#four
five#
[root@localhost ~]# sed 's/^#//' one.sh #删除开头的井号
one
two
three
four
five#
[root@localhost ~]# sed 's/#$//' one.sh #删除结尾的井号
one
#two
#three
#four
five
[root@localhost ~]# sed 's/^/#/' one.sh #在每行首加上井号
#one
#two
#three
#four
#five
[root@localhost ~]# sed '2,4s/^/#/' one.sh #在2~4行区间的行首加上井号
one
#two
#three
#four
five
在以t为行首的结尾加上$符号:
[root@localhost ~]# sed '/^t/ s/$/$/' one.sh 
one
two$
three$
four
five
[root@localhost ~]# sed -nr 's/.*root*./#&/p' /etc/passwd
#root:x:0:0:root:/root:/bin/bash
#operator:x:11:0:operator:/root:/sbin/nologin
"."表示任意字符
"*"表示所有包含"root"的内容
"&"代表旧字符能匹配到的行的内容
指定脚本内容
[root@192 ~]# vim scp.sed 
/^t/ s/^/#/     #在首字母为t的行前加上井号
/^e/ s/$/!/     #在首字母为e的行尾加上感叹号
/e$/ s/e$/E/    #把文本中所有行尾带有e的换成大写
[root@localhost ~]# sed -f scp.sed one.sh #-f表示用指定的脚本文件来处理输入的文本文件
onE
#two
#threE
four
fivE
six
seven
eight!
ninE
#ten
eleven!
#twelvE
在sed中想要实现替换,只要用实现"s!...!...!"的格式就可以作为字符串分隔符
[root@localhost ~]# sed -n 's!/bin/bash!/BIN/BASH!p' /etc/passwd 
root:x:0:0:root:/root:/BIN/BASH
linux-5:x:1000:1000:Linux-5:/home/linux-5:/BIN/BASH
插入
sed 'y/145/ABC/' testfile 
#所有的1字符转换成A,所有的2字符转换成B,所有的3字符转换成C
sed '1i 123' tesfile #在指定的行上添加内容,"a"是在指定的行下添加内容
sed '10r /etc/centos-releas' testfile #在文件中插入内容
sed '1,3{H;d};$G' testfile | sed '/^$/d'
#"{}"代表把匹配到的行进行两种操作,将1~3行剪切到末尾然后删除空行,H表示复制到剪切板,G表示粘贴
sed '1,2H;3,4G' testfile #将1、2行复制到3和4行的下面
#将字符111和222互换位置
[root@localhost ~]# echo "111222333" | sed -r 's/(111)(222)/\2\1/'
222111333
#将字符111和333互换位置
[root@localhost ~]# echo "111222333" | sed -r 's/(111)(222)(333)/\3\2\1/'
333222111
#将第一个字符和最后一个字符互换
[root@localhost ~]# echo "111222333" | sed -r 's/^(.)(.*)(.)$/\3\2\1/'
311222331
#前后调换,并且字符调换
[root@localhost ~]# echo "def123FED" | sed -r 's/^(.)(.)(.)(.*)(.)(.)(.)$/\7\6\5\4\3\2\1/'
DEF123fed


关注下面的标签,发现更多相似文章