选定行的范围:,(逗号)
删除操作:d命令
显示模式空间内容
追加(行下):a\命令
插入(行上):i\命令
退出:q命令
多点编辑:e命令
从文件读入:r命令
写入文件:w命令
替换操作:s命令 替换文本中的字符串:
全面替换标记g
保持和获取:h命令和G命令
保持和互换:h命令和x命令
sed 简介
sed 工作原理
命令格式
常用选项:
地址定界:
编辑命令:
替换标记:
sed元字符集(正则表达式)
高级编辑命令:
sed用法实例
作业:
作业:
Stream EDitor, 行编辑器
sed
是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。
命令格式
sed [options] ‘command‘ file(s)
sed [options] -f scriptfile file(s)
-n :不输出模式空间内容的自动打印
-e: 多点编辑
-f / PATH/TO/SCRIPT_FILE : 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i: 原处编辑
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行
/pattern/ :被此处模式所能够匹配到的每一行
(3) 地址范围:
#,# (3,4 表示3-4行)
#,+# (3,+4 表示3的基础加4行,也就是3-7行)
/pat1/,/pat2/ (从第一个指定的“定义”到指定的第二个“定义”)
#,/pat1/ (从第N行到指定的“定义”)
(4) ~ :步进
1~2 奇数行
2~2 偶数行
d
: 删除模式空间匹配的行 p
: 显示模式空间中的内容 a \text
:在行后面追加文本;支持使用\n 实现多行追加 i \text
:在行前面插入文本;支持使用\n 实现多行插入 c \text
:替换行为单行或多行文本 w /path/to/somefile
: 保存模式匹配的行至指定文件 r /path/from/somefile
:读取指定文件的文本至模式空间中匹配到的行后 =
: 为模式空间中的行打印行号 !
: 模式空间中匹配行取反处理 s///
:查找替换, 支持使用其它分隔符,s@@@ ,s###
g:
行内全局替换 p
: 显示替换成功的行 w /PATH/TO/SOMEFILE
:将替换成功的 行 保存至文件中 x
表示互换模板块中的文本和缓冲区中的文本。 y
表示把一个字符翻译为另外的字符(但是不用于正则表达式) \1
子串匹配标记 &
已匹配字符串标记
^
匹配行开始,如:/^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结尾的单词的行。 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的行。
h
: 把模式空间中的内容覆盖至保持空间中 H
:把模式空间中的内容追加至保持空间中 g
: 从保持空间取出数据覆盖至模式空间 G
:从保持空间取出内容追加至模式空间 x
: 把模式空间中的内容与保持空间中的内容进行互换 n
: 读取匹配到的行的下一行 覆盖 至模式空间 N
:追加匹配到的行的下一行至模式空间 d
: 删除模式空间中的行 D
:删除 当前模式空间开端至\n 的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
,(逗号)
所有在模板test和check所确定的范围内的行都被打印:
sed -n ‘/root/,/mageedu/p‘ /etc/passwd
打印从第5行开始到第一个包含以test开始的行之间的所有行:
sed -n ‘5,/^mageedu/p‘ /etc/passwd
对于模板mage和zhanghe之间的行,每行的末尾用字符串/bin/bash改成/sbin/nologin:
[root@localhost ~]# sed -i ‘/mage/,/zhanghe/s@/bin/bash@/sbin/nologin@‘ pw
d命令
删除文件的1-16行
[root@localhost ~]# sed "1,16d" /etc/fstab
proc /proc proc defaults 0 0
删除开头是以#开头的行
[root@localhost ~]# sed ‘/^#/d‘ /etc/fstab
删除文件的第2行到末尾所有行:
[root@localhost ~]# sed ‘4,$d‘ /etc/fstab
#
# /etc/fstab
删除所有以UUID开头的行
[root@localhost ~]# sed ‘/^UUID/d‘ /etc/fstab
[root@localhost ~]# sed -n ‘1,3p‘ /etc/fstab
#
# /etc/fstab
a\命令
将 this is a test line 追加到 以UUID 开头的行后面:
[root@localhost ~]# sed ‘/^UUID/a\this is a test line‘ /etc/fstab
在 test.conf 文件第2行之后插入 #mageedu:
[root@localhost ~]# sed -i ‘2a\#mageedu‘ /etc/fstab
i\命令
将 this is a test line 追加到以test开头的行前面:
[root@localhost ~]# sed ‘/^test/i\this is a test line‘ file
在test.conf文件第5行之前插入this is a test line:
[root@localhost ~]# sed -i ‘5i\this is a test line‘ test.conf
q命令
打印完第10行后,退出sed
[root@localhost ~]# sed ‘10q‘ /etc/passwd
e命令
-e选项允许在同一行里执行多条命令:
sed -e ‘1,5d‘ -e ‘s/test/check/‘ file
上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
r命令
将/etc/issue里面的内容在/etc/fstab第二行后面插入
[root@localhost ~]# sed -r ‘2r /etc/issue‘ /etc/fstab
w命令
将/etc/fstab里面开头#除外的行写入/tmp/fstab.new里面去
[root@localhost ~]# sed -n ‘/^[^#]/w /tmp/fstab.new‘ /etc/fstab
s命令
替换文本中的字符串:[root@localhost ~]# sed ‘s/book/books/‘ file
-n选项和p命令一起使用表示只打印那些发生替换的行:
[root@localhost ~]# sed -n ‘s/test/TEST/p‘ file
直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books:
[root@localhost ~]# sed -i ‘s/book/books/g‘ file
g
使用后缀 /g 标记会替换每一行中的所有匹配:
sed ‘s/book/books/g‘ file
当需要从第N处匹配开始替换时,可以使用 /Ng:
echo sksksksksksk | sed ‘s/sk/SK/2g‘
skSKSKSKSKSK
echo sksksksksksk | sed ‘s/sk/SK/3g‘
skskSKSKSKSK
h
命令和G
命令在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。
sed -e ‘/test/h‘ -e ‘$G‘ file
在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。
h
命令和x
命令互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换:
sed -e ‘/test/h‘ -e ‘/check/x‘ file
1 、删除/etc/grub2.conf 文件中所有以空白开头的行行首的
空白字符
[root@localhost ~]# sed ‘s@^[[:space:]]\+@@g‘ /etc/grub.conf
2 、删除/etc/fstab 文件中所有以# 开头,后面至少跟一个空
白字符的行的行首的# 和空白字符
[root@localhost ~]# sed ‘s@^#[[:space:]]*@@‘ /etc/fstab
3 、在/root/install.log 每一行行首增加#号
[root@localhost ~]# sed -i ‘s@^@#@g‘ install.log
4 、在/etc/fstab 文件中不以# 开头的行的行首增加#号
[root@localhost ~]# sed ‘s@^[^#]@#@g‘ /etc/fstab
5 、处理/etc/fstab 路径, 使用sed 命令取出其目录名和基名
[root@localhost ~]# echo /etc/fstab | sed ‘s@[^/]\+/\?$@@‘
/etc/
[root@localhost ~]# echo /etc/fstab | sed ‘s@[^/]+/\?$@@‘
/etc/fstab
6 、利用sed 取出ifconfig 命令中本机的IPv4 地址
[root@localhost ~]# ifconfig | sed -n 2p | sed -e ‘s@.*inet addr:@@‘ -e ‘s@B.*@@‘
10.1.252.97
7 、统计centos 安装光盘中Package 目录下的所有rpm 文件的以. 分隔倒数第二个字段的重复次数
[root@localhost Packages]# ls *.rpm | sed -r ‘s@.*\.(.*).rpm$@\1@‘ |sort |uniq -c
4 i686
919 noarch
2283 x86_64
本文出自 “家住海边喜欢浪” 博客,请务必保留此出处http://zhang789.blog.51cto.com/11045979/1836596
原文地址:http://zhang789.blog.51cto.com/11045979/1836596