linux 三剑客之sed

Posted by BenderFly on April 4, 2019

Sed 行编辑器

Sed 一次处理一行内容
1.处理时,把当前处理的行存储在临时缓冲区中,称之为“模式空间”(pattern space)
2.可以指定仅仅处理哪些行,Sed 符合模式条件的处理,不符合条件的不予处理
3.处理完成之后把缓冲区的内容送往屏幕
4.接着处理下一行,这样不断重复,直到文件末尾

Sed 命令格式

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  #打印日志文件中出现错误信息的行号及其内容