Linux文本处理工具sed
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux文本处理工具sed相关的知识,希望对你有一定的参考价值。
文本处理Sed!!!
sed是一个行编辑器,用于修改文件内容
功能:用于处理编辑一个或多个文件
官网:http://www.gnu.org/software/sed/manual/sed.html
默认情况下,sed每读入一行会自动的把读入模式空间的数据打印出来,处理完成后,会接着自动读入下一行,开始下一轮循环,如果后面没有‘D’这种的特殊指令,会在两个循环之间清空模式空间,意思就是在读入下一行的时候会清掉上一行,如果有'D'这样的指令,就不会清空前面的那一行数据了,默认情况下不会修改文件内容,除非加入一些指令
用法:
sed [option]...'script(意味着sed命令自带的语言)' inputfile(要处理的文件,可以写多个)...
script的格式:
由'地址命令'组成,地址代表的就是要处理的文件中的某些行,而命令代表的sed中的一些指令
常用选项:
-n:不输出模式空间内容到屏幕,也就是不自动打印
-e:多点编辑
-f:/PATH/script_file:从指定文件中读取编辑脚本
-r:支持使用扩展正则表达式
-i.bak:加一个后缀的话会先做一个备份文件之后开始编辑文件
(例子:sed -i.bak '7a alias cdnet="cd /etc/sysconfig/network-scripts"' ~/.bashrc先将~/.bashrc文件备份为~/.bash.bak文件然后在~/.bashrc的第7行下面添加一个别名)
地址定界:
(1)不给地址:对全文进行处理
(2)单地址:
#:直接给个行号,可以直接显示某一行(例子:sed -n '2p' /etc/issue 只打印/etc/issue的第二行,p是打印的意思)
$:代表最后一行(例子:sed -n '$p' /etc/fstab,仅打印最后一行)
模式:两个//之间,可以写正则表达式,(例子:sed -n '/^U/p' /etc/fstab,仅将U开头的行打印出来,p是打印的意思)
(3)地址范围:
#,#:行的范围,从第几行到第几行(例子:sed -n '9,12p' /etc/fstab,仅打印文件中第9行到第12行之间的数据)
#,+#:第几行到这一行之后的多少行(例子:sed -n '9,+3p' /etc/fstab.仅打印文件中第9行到第9行之后的数据,也就是9到9+3之间的行)
/part1/,/part2/:两个模式之间的行(例子:sed -n '/^b/,/^l/p' /etc/passwd仅显示b开头到l开头的行);
但要注意,如果匹配到结束位置之后下面如果还有符合第一个模式的值,就还会继续显示,接着会寻找第二个模式相匹配的行,如果没有就会全部显示
#,/part1/:表示从第几行到模式(例子:sed -n '3,/^f/p',仅打印从第三行到以f开头的行,模式与#反过来写也可以,比如说:
sed -n '/^f/,20p',仅打印以f开头的行到第20行之间的数据)
(4)~步进:(就是从开始位置递增每次递增几行,一直到结束)
1~2奇数行,1-3-5-7-9...
(例子:sed -n '1~2p' /etc/passwd,仅打印从第一行开始每次递增两行也就是第一行,然后第一行+2=3,第三行+2等于5,以此类推一直到结束)
2~2偶数行,2-4-6-8-10....
(例子:sed -n '2~2' /etc/passwd,仅打印从第二行开始每次递增两行也就是第二行,然后第二行+2=4,第四行+2等于6,以此类推一直到结束)
编辑命令:
p:满足前面地址定界就打印
d:删除模式空间匹配的行,默认情况下会将每一行读取到模式空间里,并开始下一轮循环,就读入新的一行
(例子:cat -n /etc/passwd | sed '20,30d' 显示删除20-30之后的行,因为sed会自动打印模式空间的数据,如果加上-n就会全部都不显示)
a[\]text:如果地址满足条件则在地址匹配的行的下面追加文本,直接在a后面输入要追加的数据可以,也可以在a前面输入一个\意思就是\后面的文本都是要追加的文本,适用于要追加空格,如果要添加多行,需要换行的话,在要换行的位置输入\n即可
i[\]text:如果地址满足条件则在地址匹配的行的上面追加文本,直接在i后面输入要追加的数据可以,也可以在i前面输入一个\,意思就是\后面的文本都是要追加的文本,适用于要追加空格,如果要添加多行,需要换行的话,在要换行的位置输入\n即可
c[\]text:替换前面地址满足的行
w "路径文件":将符合模式的行存到一个新的文件中(例子:sed '/^alias/w/app/f1.txt' ~/.bashrc,将~/.bashrc文件中以alias开头的行存到/app/f1.txt文件中并且打印在屏幕)
r "路径文件":读取路径文件中的数据到符合地址对应的文件后面(例子:sed '/^alias/r/etc/centos-release' ~/.bashrc,将/etc/centos-release中的数据读取到~/.bashrc的以alias开头的行下面)
=:显示符合条件的行的行号(例子:sed '/^alias/=' ~/.bashrc,显示~/.bashrc中以alias开头的行的行号)
!:取反(例子:sed -n '/^alias/!p' ~/.bashrc 除了以alias开头的行其他的行都打印)
非常实用的技术!!!(敲黑板,必会!)
s///:搜索替代,支持使用其他分隔符,[email protected]@@,s###...如果默认这样写,只替代这一行里找到的第一个字符串
替换标记:
g:将全部匹配的全部替换
p:显示替换成功的行
w:跟上面含义一样的
例子:
sed 's#/bin/bash$#/sbin/nologin#' /etc/passwd,将/etc/passwd文件中所有以/bin/bash结尾的行替换为以/sbin/nologin结尾
sed -r 's#(/bin/bash$)#------\1=====#' /etc/passwd,/etc/passwd文件中在/bin/bash的前面和后面加上---和===字符
以上是关于Linux文本处理工具sed的主要内容,如果未能解决你的问题,请参考以下文章