什么是Sed
sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
处理单个或多个文件的命令格式
sed [options] '[匹配模式] [sed 的内部命令]' file1 file2
把匹配模式和内部命令写在一个文件中的方式
sed [options] -f sedcommand.sed file
options 是可选的选择或参数
匹配模式 是可选的用于在文件中每一行进行匹配到模式,模式可以是正则,也可以是文件的行号
内部的命令也是可选的,但是两个单引号是必须的
sed 和 grep 不一样,不管是否找到指定的模式,他的退出状态都是0,只有当命令存在语法错误时,sed的退出状态才是非0
支持正则表达式
sed默认会输出文件的每一行,无论这行的内容是否能够匹配上匹配模式,假如被匹配到的会再输出一次。
与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。
正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。
使用基本元字符集^, $, ., *, [], [^], \< \>,\(\),\{\}
使用扩展元字符集?, +, { }, |, ( )
使用扩展元字符的方式:
sed -r ' ' passwd
sed -r 'p' passwd
sed -r -n 'p' passwd `n`屏蔽默认输出
sed -r -n '/root/p' passwd 显示存在root的行 ^显示以root开头的行
搜索替换
sed会自动打印文件的每一行,查找模式匹配的行,找到后执行后面的命令,默认是输出(不加-n)
sed -r 's/root/localhost/' passwd 搜索每一行找到root,把第一个替换成localhost
sed -r `s/root/localhost/g` passwd 全局替换
sed -r 's/root/localhost/gi' passwd 忽略大小写
sed -ri 's/root/localhost/g' passwd 修改文件内容
sed -r '/root/d' 找到含有root 的进行删除
sed -r '#root#d#' passwd 可以使用不用的定界符
注意:
sed
默认是在只读的模式下进行修改的不会直接修改文件内容sed -r -i
加了-i
选项才会修改文件内容
当模式匹配中使用其他定界符号时,需要对于其进行转义。
其他定界符在s
搜索替换时不必转义比如
sed -r 's#root#localhost#' passwd
sed -r 's%root%localhost%' passwd
sed -r 's|root|localhost|' passwd
扩展
sed -r 'd' passwd 全部删除
sed -r '2 d' passwd 删除两行
sed -r '1,2 d' passwd 第1行到第2行删除
sed -r '/root/ d' passwd 含有root字符串的行删除
从含有 root 字符串的行开始,一直到第 5 行进行删除
sed -r '/root/,5 d' passwd
从行首是 adm 的行开始,一直到 20 行进行删除
sed -r '/^adm/,20 d' passwd
从行首是 adm 的行,以及此行之后的 2 行进行删除
sed -r '/^adm/,+2 d' passwd
含有 root 的行不删除,其他都删除
sed -r '/root/ !d' passwd
奇数行删除,其实就是 匹配到 行号 除以 2 ,余数是 1 的行
sed -r '1~2 d' passwd
偶数行打印
sed -rn '0~2 p' passwd
在212391前添加zgh字符串
sed -r 's/^(212.*)/zgh\1/g' \1是指括号内容之前添加
sed内部命令
sed命令告诉 sed 对匹配到的行进行何种操作,包括打印、删除、修改等。
命令功能详解
a 在当前行后添加一行或多行
c 用新文本修改(替换)当前行中的文本
d 删除行
i 在当前行之前插入文本
l 列出非打印字符
p 打印行
n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q 结束或退出sed
! 对所选行以外的所有行应用命令
s 用一个字符串替换另一个
s 替换标志
g 全局替换
i 忽略大小写
r 从文件中读
w 将行写入文件
y 将字符转换为另一字符(不支持正则表达式)
h 清除保持空间的内容后,把模式空间里的内容复制到保持空间
H 把模式空间里的内容追加到保持空间
g 清除模式空间的内容后, 取出保持空间的内容,并复制到模式空间
G 取出保持空间的内容,追加在模式空间原有内容的后面
x 交换模式空间与保持空间的内容
Sed命令选项
-e 允许多项编辑
-f 指定sed脚本文件名
-n 取消默认的输出
-i inplace,就地编辑
-r 支持扩展元字符
网友评论