sed的工作流程

shell编程之文本处理工具sed_脚本格式

首先sed把当前正在处理的行保存在一个临时缓存区中,然后处理临时缓冲区

中的行,完成后把该行发送到屏幕上。

按行处理,默认情况下,不修改源文件,改变输出

sed使用方法

sed常见的语法格式有两种,一种叫命令行模式,另一种叫脚本模式。

命令行格式

格式

sed [option]  'sed的命令|地址定位' filename

shell script使使

option
-e sed使
-n
-f sed
-r 使
-i inplace

sed
//

常用命令和选项

p 
d

i\ "\" vim>O
a\ \ vim> o
c\ "\"

r
w
!

s
g

& 便 \( \)
\( \)
=

举例说明


[root@server shell06]# cat 2.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1

p 打印行

-n 取消默认输出

[root@bobilinux tmp]# sed 'p' 2.txt 
root:x:0:0:root:/root:/bin/bash #源文件中的内容
root:x:0:0:root:/root:/bin/bash #sed 处理结果
bin:x:1:1:bin:/bin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
298374837483
298374837483
172.16.0.254
172.16.0.254
10.1.1.1
10.1.1.1

[root@bobilinux tmp]# sed -n 'p' 2.txt # 取消默认输出打印源文件
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1

[root@bobilinux tmp]# sed -n '1p' 2.txt # 打印第一行
root:x:0:0:root:/root:/bin/bash

[root@bobilinux tmp]# sed -n '2p' 2.txt
bin:x:1:1:bin:/bin:/sbin/nologin

[root@bobilinux tmp]# sed -n '1,3p' 2.txt # 打印第一行到第三行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@bobilinux tmp]# sed -n '$p' 2.txt # 打印最后一行
10.1.1.1

d 删除行

[root@bobilinux tmp]# sed '1d' 2.txt            # 删除第一行
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1

# d 不要和 -n 一起使用
[root@bobilinux tmp]# sed -n '1d' 2.txt # 取消默认输出
[root@bobilinux tmp]#

[root@bobilinux tmp]# sed '1,5d' 2.txt # 删除第一行到第五行
298374837483
172.16.0.254
10.1.1.1

[root@bobilinux tmp]# sed '$d' 2.txt # 删除最后一行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254

i\ 在当前行之前插入文本

[root@bobilinux tmp]# sed 'i\hello' 2.txt       # 在所有行之前插入hello
hello
root:x:0:0:root:/root:/bin/bash
hello
bin:x:1:1:bin:/bin:/sbin/nologin
hello
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
adm:x:3:4:adm:/var/adm:/sbin/nologin
hello
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
hello
298374837483
hello
172.16.0.254
hello
10.1.1.1

[root@bobilinux tmp]# sed '1i\hello' 2.txt # 在第一行之前插入hello
hello
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1

[root@bobilinux tmp]# sed '1i\hello\nworld\n888' 2.txt # 插入多行内容(每一行内容用\n分隔,除最后一行外)
hello
world
888
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1
[root@bobilinux tmp]#
[root@bobilinux tmp]#
[root@bobilinux tmp]# sed '1i\hello\ # 插入多行内容(每一行内容用\续行,除最后一行外)
> world\
> 999' 2.txt
hello
world
999
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1

a\ 在当前行后添加一行或多行

[root@bobilinux tmp]# sed '3a\hello' 2.txt      # 在第三行后追加hello
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
298374837483
172.16.0.254
10.1.1.1

[root@bobilinux tmp]# sed '$a\hello' 2.txt # 在最后一行后追加hello
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1
hello

[root@bobilinux tmp]# sed '3a\hello\nworld' 2.txt # 追加多行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
world
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
298374837483
172.16.0.254
10.1.1.1

[root@bobilinux tmp]# sed '3a\hello\ # 追加多行
> world\
> 888' 2.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
hello
world
888
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
298374837483
172.16.0.254
10.1.1.1

c\ 用此符号后的新文本替换当前行中的文本(整行替换)

可搭配正则表达式进行匹配行替换:

sed '/正则表达式/c\...' 文件         匹配正则表达式所在的那一行进行整行替换

[root@bobilinux tmp]# sed '2c\hello world' 2.txt       # 把第二行替换成 hello world
root:x:0:0:root:/root:/bin/bash
hello world
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
298374837483
172.16.0.254
10.1.1.1

[root@bobilinux tmp]# sed '/root/c\hello world' 2.txt # 把包含关键字 root 的那一行替换成 hello world
hello world
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1

[root@bobilinux tmp]# sed '/[a-z]/c\hello' 2.txt
hello
hello
hello
hello
hello
298374837483
172.16.0.254
10.1.1.1

r 从文件中读取内容输入到当前行的下面

[root@bobilinux tmp]# sed '$r /etc/hosts' 2.txt       # 把/etc/hosts文件中的内容放在最后一行的下面
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1
127.0.0.1 localhost bobilinux localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

w 将所选的行写入到其他的文件中(覆盖)

也可以搭配正则表达式进行匹配行

[root@bobilinux tmp]# sed '1,3w a.txt' 2.txt      # 把第一行到第三行的内容覆盖到a.txt文件中
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1
[root@bobilinux tmp]# cat a.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@bobilinux tmp]# sed '/^[0-9]/w a.txt' 2.txt # 匹配以数字开头的行覆盖到文件中
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1
[root@bobilinux tmp]# cat a.txt
298374837483
172.16.0.254
10.1.1.1

[root@bobilinux tmp]# sed -n '/[0-9]{4}/w a.txt' 2.txt
[root@bobilinux tmp]# cat a.txt
[root@bobilinux tmp]# sed -nr '/[0-9]{4}/w a.txt' 2.txt # 扩展正则表达式 sed -r
[root@bobilinux tmp]# cat a.txt
298374837483
[root@bobilinux tmp]# sed -n '/[0-9]\{4\}/w b.txt' 2.txt # 通过 \ 将扩展正则变成普通正则,就不需要 sed -r
[root@bobilinux tmp]# cat b.txt
298374837483

! 对所选行以外的所有行应用命令,放到行数之后(取反)

[root@bobilinux tmp]# sed -n '1,5p' 2.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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

[root@bobilinux tmp]# sed -n '1,5!p' 2.txt
298374837483
172.16.0.254
10.1.1.1

s 用一个字符串替换另一个

g 在行内进行全局替换

替换的是关键字,而不是整行(c\)

搜索替换中的分隔符可以自己指定

[root@bobilinux tmp]# sed -n 's/root/ROOT/p' 2.txt 
ROOT:x:0:0:root:/root:/bin/bash

[root@bobilinux tmp]# sed -n 's/root/ROOT/gp' 2.txt
ROOT:x:0:0:ROOT:/ROOT:/bin/bash

[root@bobilinux tmp]# sed -n 's#root#ROOT#gp' 2.txt
ROOT:x:0:0:ROOT:/ROOT:/bin/bash

[root@bobilinux tmp]# sed 's//sbin/nologin/hello/g' 2.txt
sed: -e expression #1, char 9: unknown option to `s'
[root@bobilinux tmp]# sed -n 's#/sbin/nologin#hello#gp' 2.txt
bin:x:1:1:bin:/bin:hello
daemon:x:2:2:daemon:/sbin:hello
adm:x:3:4:adm:/var/adm:hello
lp:x:4:7:lp:/var/spool/lpd:hello


# 把前五行行首替换成#(注释前五行)
[root@bobilinux tmp]# sed -n '1,5s/^/#/gp' 2.txt
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#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


# 把文件中的 / : . 删除——>把 / : . 替换成空(d 删除整行)
[root@bobilinux tmp]# sed 's/[/:.]//g' 2.txt
rootx00rootrootbinbash
binx11binbinsbinnologin
daemonx22daemonsbinsbinnologin
admx34admvaradmsbinnologin
lpx47lpvarspoollpdsbinnologin
298374837483
172160254
10111

&   保存查找的串以便在替换串中引用(全部保留)     同 \( \)

(换种说法:在指定的字符串前后插入字符)

[root@bobilinux tmp]# sed -n 's/root/hello root/gp' 2.txt 
hello root:x:0:0:hello root:/hello root:/bin/bash

[root@bobilinux tmp]# sed -n 's/root/hello &/gp' 2.txt
hello root:x:0:0:hello root:/hello root:/bin/bash

[root@bobilinux tmp]# sed -n 's/\(root\)/hello \1/gp' 2.txt
hello root:x:0:0:hello root:/hello root:/bin/bash


# 注释的另一种写法
[root@bobilinux tmp]# sed -n 's/root/#&/p' 2.txt
#root:x:0:0:root:/root:/bin/bash
[root@bobilinux tmp]# sed -n 's/root/#&/gp' 2.txt
#root:x:0:0:#root:/#root:/bin/bash
[root@bobilinux tmp]# sed -n 's/^root/#&/p' 2.txt
#root:x:0:0:root:/root:/bin/bash
[root@bobilinux tmp]# sed -n 's/^root/#&/gp' 2.txt
#root:x:0:0:root:/root:/bin/bash

\( \)  还可以用于精确匹配(选择性保留)

将目标外的内容精确匹配出来(包括空格也要一模一样)

目标用 \(.*\) 表示,后面用 \1 调用前面 \(.*\) 内的内容,将其打印输出

[root@bobilinux tmp]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:ED:AA:03
inet addr:192.168.192.131 Bcast:192.168.192.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feed:aa03/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3194 errors:0 dropped:0 overruns:0 frame:0
TX packets:2135 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:303122 (296.0 KiB) TX bytes:249543 (243.6 KiB)

[root@bobilinux tmp]# ifconfig eth0|sed -n 's/^.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)/\1 \2 \3/gp'
192.168.192.131 192.168.192.255 255.255.255.0

=  打印关键字所在的行的行号

[root@bobilinux tmp]# sed -n '/bash$/=' 2.txt 
1
[root@bobilinux tmp]# sed -n '/root/=' 2.txt
1

-e 进行多项编辑,即对输入行应用多条sed命令时使用

# 既打印行号,又打印内容
[root@bobilinux tmp]# sed -ne '/bash$/=' -ne '/bash$/p' 2.txt
1
root:x:0:0:root:/root:/bin/bash

# 也可以不用 -e ,把两个命令写在一起,用 ; 隔开
[root@bobilinux tmp]# sed -n '/bash$/=;/bash$/p' 2.txt
1
root:x:0:0:root:/root:/bin/bash

-i inplace,修改源文件

# {} 用于在定位行后面把多个命令组合起来,如果没有定位行,就不需要了
[root@bobilinux tmp]# sed -i '1{s/root/ROOT/;s#/bin/bash#/sbin/nologin#}' 2.txt
[root@bobilinux tmp]# cat 2.txt
ROOT:x:0:0:root:/root:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1



-i -n p 使

[root@bobilinux tmp]# sed -i 's/ROOT/root/gp' 2.txt # 文件中多一行
[root@bobilinux tmp]# cat 2.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
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
298374837483
172.16.0.254
10.1.1.1
[root@bobilinux tmp]# sed -ni 's/root/ROOT/g' 2.txt # 文件内容清空了
[root@bobilinux tmp]# cat 2.txt
[root@bobilinux tmp]#

注释的几种用法总结:

[root@bobilinux tmp]# sed -n '1,5s/^/#/gp' 2.txt      
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#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


[root@bobilinux tmp]# sed -n 's/^root/#&/gp' 2.txt
#root:x:0:0:root:/root:/bin/bash


[root@bobilinux tmp]# sed -n 's/root/#&/p' 2.txt
#root:x:0:0:root:/root:/bin/bash



sed -n -r 's/^root|^stu/#&/p' /etc/passwd rootstu
sed -n '1,5s/^[a-z].*/#&/p' passwd 1~5

应用案例1:过滤IP地址,掩码,网关

[root@bobilinux tmp]# cat ifcfg-eth0 
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
USERCTL=no
PEERDNS=yes
IPV6INIT=no
IPADDR=10.1.1.1
NETMASK=255.255.255.0
GATEWAY=10.1.1.254


sed

[root@bobilinux tmp]# sed -nr '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/p' ifcfg-eth0
IPADDR=10.1.1.1
NETMASK=255.255.255.0
GATEWAY=10.1.1.254
[root@bobilinux tmp]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0
IPADDR=10.1.1.1
NETMASK=255.255.255.0
GATEWAY=10.1.1.254

awk cut sed

[root@bobilinux tmp]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|awk -F "=" '{print $2}'
10.1.1.1
255.255.255.0
10.1.1.254

[root@bobilinux tmp]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|cut -d= -f2
10.1.1.1
255.255.255.0
10.1.1.254

[root@bobilinux tmp]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|sed -n 's/[A-Z=]//gp'
10.1.1.1
255.255.255.0
10.1.1.254

grep -o

[root@bobilinux tmp]# grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' ifcfg-eth0
IPADDR=10.1.1.1
NETMASK=255.255.255.0
GATEWAY=10.1.1.254
[root@bobilinux tmp]# grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' ifcfg-eth0
10.1.1.1
255.255.255.0
10.1.1.254

应用案例2:截取IP地址,掩码,网关

[root@bobilinux tmp]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:0C:29:ED:AA:03
inet addr:192.168.192.131 Bcast:192.168.192.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feed:aa03/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6371 errors:0 dropped:0 overruns:0 frame:0
TX packets:4230 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:605614 (591.4 KiB) TX bytes:495580 (483.9 KiB)


[root@bobilinux tmp]# ifconfig eth0|sed -n '2p'|sed -n 's/[:a-Z]//gp'|sed -n 's/ /\n/gp'|sed '/^$/d'
192.168.192.131
192.168.192.255
255.255.255.0

[root@bobilinux tmp]# ifconfig eth0|sed -n 's/^.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)/\1 \2 \3/gp'
192.168.192.131 192.168.192.255 255.255.255.0
[root@bobilinux tmp]# ifconfig eth0|sed -n 's/^.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)/\1\n\2\n\3/gp'
192.168.192.131
192.168.192.255
255.255.255.0

脚本格式

把 sed 命令堆积到脚本中,用脚本去处理文件

用法


sed -f scripts.sed file //使

:
chmod +x sed.sh
./sed.sh file //使



#!/bin/sed -f

''
1,5d
s/root/hello/g
3i 777
5i 888
a
p

注意事项

 sed  'commands'
 tab
 
 
 #号开头的行为注释

举例说明


[root@bobilinux tmp]# cat 2.txt
ett:x:821:821::/home/ett:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
user01:x:822:822::/home/user01:/bin/bash
user02:x:823:823::/home/user02:/bin/bash
user03:x:824:824::/home/user03:/bin/bash
user04:x:825:825::/home/user04:/bin/bash
user05:x:826:826::/home/user05:/bin/bash
yy1:x:827:827::/home/yy1:/bin/bash


sed
[root@bobilinux tmp]# cat sed.sh
#!/bin/sed -f
5,9c hello world
1,4s/^/#/g
$a *********end***********



[root@bobilinux tmp]# sed -f sed.sh 2.txt
#ett:x:821:821::/home/ett:/bin/bash
#rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
#rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
#nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
hello world
yy1:x:827:827::/home/yy1:/bin/bash
*********end***********



[root@bobilinux tmp]# chmod +x sed.sh
[root@bobilinux tmp]# ./sed.sh 2.txt
#ett:x:821:821::/home/ett:/bin/bash
#rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
#rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
#nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
hello world
yy1:x:827:827::/home/yy1:/bin/bash
*********end***********



[root@bobilinux tmp]# cat 2.txt
ett:x:821:821::/home/ett:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
user01:x:822:822::/home/user01:/bin/bash
user02:x:823:823::/home/user02:/bin/bash
user03:x:824:824::/home/user03:/bin/bash
user04:x:825:825::/home/user04:/bin/bash
user05:x:826:826::/home/user05:/bin/bash
yy1:x:827:827::/home/yy1:/bin/bash


-i


[root@bobilinux tmp]# sed -f sed.sh -i 2.txt
[root@bobilinux tmp]# cat 2.txt
#ett:x:821:821::/home/ett:/bin/bash
#rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
#rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
#nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
hello world
yy1:x:827:827::/home/yy1:/bin/bash
*********end***********



[root@bobilinux tmp]# ./sed.sh -i 2.txt
[root@bobilinux tmp]# cat 2.txt
#ett:x:821:821::/home/ett:/bin/bash
#rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
#rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
#nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
hello world
yy1:x:827:827::/home/yy1:/bin/bash
*********end***********

sed和正则的综合运用

1 /
sed '/root/d' file
sed '/^root/d' file


2使 sed-r
grep -E
sed -r
+ ? () {n,m} | \d


(^$.*/[]), "\"
egsed '/\$foo/p' file


3
sed '5,7d' file 57
sed '/root/,/ftp/d' file
"root""ftp"


4
sed '1,/foo/d' file "foo"
sed '/foo/,+4d' file foo
sed '/foo/,~3d' file foo3
sed '1~5d' file
sed -nr '/foo|bar/p' file "foo""bar"
sed -n '/foo/,/bar/p' file foobar

sed '1~2d' file
sed '0-2d' file sed '1~2!d' file


5
sed '$d' file
sed '1d' file


6
sed 's/^.//' a.txt
sed 's/.$//' a.txt

sed 's/.//2' a.txt
sed 's/.//N' a.txt NNN>2