sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
常用选项[OPTION]参数
-e script –expression=script 以选项中的指定的script来处理输入的文本文件
-f script –files=script 以选项中的指定的script文件来处理输入的文本文件
-h –help 显示帮助
-n –quiet –silent 仅显示script处理后的结果
-V –version 显示版本信息
-i 原文件编辑(直接修改原处理文件),不添加-i参数,不会对原文件进行修改
-r 在脚本中使用扩展正则表达式
-s 将输入文件视为各个独立的文件而不是一个长的连续输入
如果没有 -e, –expression, -f 或 –file 选项,那么第一个非选项参数被视为sed脚本。其他非选项参数被视为输入文件,如果没有输入文件,那么程序将从标准输入读取数据。
sed命令
p :显示,将某个选择的数据打印显示。通常 p 会与参数 sed -n 一起执行
P 大写P打印模板块的第一行
a :添加, a 的后面可以接字符串,该字符串会在当前指定行的下一行出现
d :删除,显示模式空间删除指定行后的内容,不会对原文件数据删除
D 删除模板块的第一行
c :更改, c 的后面可以接字符串,该字符串可以取代 n1,n2 之间的行
i :插入, i 的后面可以接字符串,该字符串会在当前指定行的上一行出现
s :替换,通常 s 的动作,如 sed “s/old/new/g” file
h 拷贝模板块的内容到内存中的缓冲区
H 追加模板块的内容到内存中的缓冲区
g 获得内存缓冲区的内容,并替代当前模板块中文本
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面
l 列表不能打印字符的清单
n 读取下一个输入行,用下一个命令处理新的行而不是第一个命令
N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码
q 退出sed
r file 从file中读行
w file 写并追加模板块到file末尾
W file 写并追加模板块的第一行到file末尾
= 打印当前行号
#把注释扩展到第一个换行符以前
sed替换标记
g 表示行内全面替换
p 表示打印行
w 表示把行写入一个文件
x 表示互换模板块中的文本和缓冲区中的文本
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\1 子串匹配标记 #如s/(is) frank/\1/ 匹配的是is
& 已匹配字符串标记 #如s/(is) frank/&/ 匹配的是is frank
sed元字符集
命令 说明
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[] 匹配一个指定范围内的字符,如/[sS]ed/匹配sed和Sed。
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
(..) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers。
& 保存搜索字符用来替换其他字符,如s/love/&/,love这成love。
< 匹配单词的开始,如:/<love/匹配包含以love开头的单词的行。
> 匹配单词的结束,如/love>/匹配包含以love结尾的单词的行。
x{m} 重复字符x,m次,如:/0{5}/匹配包含5个0的行。
x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。
关于 p 模式(打印)
sed -n '/UUID/p' /etc/fstab #打印含有字符串 UUID 的行
sed -n '/UUID$/p' /etc/fstab #打印以 UUID 结尾的行
sed -n '/^$/p' /etc/fstab #打印空行
sed -n '2,6p' /etc/fstab #打印2-6行
sed -n '2,6!p' /etc/fstab #打印除了 2到6 行之外的其他行
sed '1~2p' file #打印奇数行
sed '1~2!p' file #打印偶数行
关于 a 模式(添加)
sed '/^UUID/a\hello world' /etc/fstab #指定行的下一行,添加 hello world
sed -e '5a\hello world' /etc/fstab #在文件 /etc/fstab 中指定第五行的下一行添加字符串
sed -e '1a\hello sed' -e '5a\hello world' /etc/fstab #在文件 /etc/fstab 中指定第一行、第五行的下一行分别添加字符串
关于 d 模式(删除)
sed '/UUID/d' /etc/fstab #在模式空间删除 含有 UUID 字符串的行
sed '/^UUID/!d' /etc/fstab #在模式空间删除除了以 UUID 开头之外的行后的内容
sed '/^$/d' /etc/fstab #在模式空间删除 空行 后的内容
sed '1,4d' /etc/fstab #在模式空间 删除 1到4行后的内容
关于 w 模式(写入)
sed '/^UUID/w /tmp/fstab.txt' /etc/fstab #将文件 /etc/fstab 中以 UUID 开头的行指定输出(重定向)到 /tmp/fstab.txt 且不显示到屏幕
关于 c 模式(更换)
**是替换整行 **
sed '/UUID/c\hello world' /etc/fstab #将 /etc/fstab 中含有字符串 UUID 的行替换为 hello world
关于 i 模式(插入)
sed '/^UUID/i\hello world' /etc/fstab #找出文件 /etc/fstab 中以 UUID 开头的行,并在其上一行添加单行字符串(插入指定行)
关于 s 用法(替换)
sed ‘s/要被替代的字符串/新的字符串/’ (斜杠为定界符)
sed ‘s/要被取代的字符串/新的字符串/g’ (斜杠为定界符,g 对模式空间指定情况的全局更改)
sed 's/\//$/g' /etc/fstab #将所有的 / 转为 $ (反斜杠为转义字符即 \ / 相当于 / )
sed -n 's/my \(name\)/& is han/p' test.txt #组替换为my name is han
sed -n 's/my \(name\)/\1 is han/p' test.txt #组替换为name is han
打印文件中的行号
sed '/^UUID/=' /etc/fstab #打印指定行号(模式空间中的指定行),如以 UUID 开头的行(行号显示在其上一行)
sed -n '$=' /etc/fstab #打印文件的总行数
sed -n '/error/{=;p}' /var/log/messages #打印日志文件中出现错误信息的行号及其内容