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 注释掉以root开头或者以stu开头的行
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
注意事项
1) 脚本文件是一个sed的命令行清单。 'commands'
2) 在每行的末尾不能有任何空格、制表符(tab)或其它文本。
3) 一行一个命令,如果在一行中有多个命令,应该用分号分隔。
4) 不需要且不可用引号保护命令
5) #号开头的行为注释
举例说明
参考文件:
[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
注意:
在正则表达式中如果出现特殊字符(^$.*/[]),需要以前导 "\" 号做转义
eg:sed '/\$foo/p' file
3、逗号分隔符
例如:sed '5,7d' file 删除5到7行
例如:sed '/root/,/ftp/d' file
删除第一个匹配字符串"root"到第一个匹配字符串"ftp"的所有行本行不找 循环执行
4、组合方式
例如:sed '1,/foo/d' file 删除第一行到第一个匹配字符串"foo"的所有行
例如:sed '/foo/,+4d' file 删除从匹配字符串”foo“开始到其后四行为止的行
例如:sed '/foo/,~3d' file 删除从匹配字符串”foo“开始删除到3的倍数行(文件中)
例如:sed '1~5d' file 从第一行开始删每五行删除一行
例如:sed -nr '/foo|bar/p' file 显示配置字符串"foo"或"bar"的行
例如:sed -n '/foo/,/bar/p' file 显示匹配从foo到bar的行
例如: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 从文件中第N行开始,删除每行中第N个字符(N>2)