[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