流编辑器sed
sed是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间”( pattern space ), 接着用sed命合处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
命令格式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
注意:
sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0
只有当命令存在语法错误时,sed的退出状态才是非0
支持正则表达式
与grep一样 , sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。
使用基本元字符集 ^ $ . * [] [^] \<\> \(\) \{\}
使用扩展元字符集 ? + { } | ( )
使用扩展元字符的方式:
\+
sed -r
sed基本用法
sed -r '' passwd
sed -r 'p' passwd # 打印
sed -r -n 'p' passwd # 原输出静默处理
sed -r -n '/root/p' passwd # 使用正则
sed -r 's/root/alice/' passwd # 查找替换
sed -r 's/root/alice/gi' passwd # i忽略大小写
sed -r 's#root#alice#go' passwd
sed -r '/root/d' passwd
sed -r '\#root#d' passwd
# 注意:查找时候用#或@等符号需要\转义
sed扩展
地址(定制)
地址用于决定对哪些行进行编辑。地址形式可以是数字、正则表达式或二者的结合。如果没有指定地址,sed将处理输入文件中的所有行。
sed -r 'd' passwd
sed -r '3d' passwd
sed -r '1,3d' paaswd
sed -r '1,$d' passwd
sed -r '/root/d' passwd
sed -r '/root/,5d' passwd
sed -r '/^bin/,5d' passwd # 删到第5行 不包括原来那行
sed -r '/^bin/,+5d' passwd # 再删除5行 加上原来那行6行
sed -r '/root/!d' passwd
sed -r '1~2d' passwd # 删除所有奇数行 odd-numbered
sed -r '0~2d' passwd # 删除所有偶数行 even-numbered
sed命令
sed命令告诉sed对指定行进行何种操作,包括打印、删除、修改。
a 在当前行后添加一行或多行
c 用新文本修改(替换)当前行中的文本
d 删除行
i 在当前行之前插入文本
l 列出非打印字符
p 打印行
n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q 结束或退出sed
! 对所选行以外的所有行应用命令
s 用一个字符串替换另一个
s 替换标志
g 全局替换
i 忽略大小写
r 从文件中读
w 将行写入文件
y 将字符转换为另一字符(不支持正则表达式)
h 把模式空间中的内容复制到暂存缓冲区(覆盖)
H 把模式空间里的内容追加到暂存缓冲区
g 取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处的原有内容
G 取出暂存缓冲区的内容,将其复制到模式空间,追加该处的原有内容
x 交换暂存缓冲区与模式空间的内容
# 删除:d
sed -r '3{d;}' datafile
sed -r '$d' datafile
# 替换命令:s
sed -r 's/west/north/g' datafile
sed -r 's/^west/north/' datafile
sed -r 's/[0-9][0-9]$/&.5' datafile # &代表在查找串中匹配的内容
sed -r 's/(mar)got/\1ann/g' datafile
sed -r 's#3#88#g' datafile
sed常见操作
# 删除配置文件中#号注释行
sed -ri '/^#/d' file.conf
sed -ri '/^[ \t]*#/' file.conf
# 删除配置文件中//注释行
sed -ri '\#^[ \t]*//#d' file.conf
# 删除无内容空行
sed -ri '^[ \-t]*$d/d' file.conf
# 删除注释行及空行
sed -ri '/^[ \t]*#/d;/^[ \t]*$/d' file.conf
sed -ri '/^[ \t]*#|^[ \t]*$/d' file.conf
sed -ri '/^[ \t]*(#|$)/d' file.conf
# 修改文件
sed -ri '$a\chroot_local_user=YES' file.conf
sed -ri '/^SELINUX=/cSELINUX=disabled' file.conf
# 给文件行添加注释
sed -r '2,6s/^/#/' test
sed -r '2,6s/(.*)/#\1/' test
sed -r '2,6s/.*/#&/'test # &代表在查找串中匹配的内容
# 将行首零个或多个#换成一个#
sed -r '3,$ s/^#*/#/' test
sed -r '3,10 s/^[ \-t]*#/#/' test
sed -r '2,8 s/^[ \-t#]*/#/' test
# sed -r '1!G;$!h;$!d' 12345.txt
sed使用外部变量
var1=11111
(x)sed -ri '3a$var1' file
sed -ri "3a$var1" file
sed -ri 3a$var1 file
(x)sed -ri "$a#var1" file # 在尾行添加var1
sed -ri '$a'"$var1" file
sed -ri "\$a$var" file