D.H.Q的烂笔头

Just code for fun~

linux命令学习 -- sed

sed(streams editor) 是一个文件处理的编辑器,具有对文件数据进行新增、替换、删除、打印、取代特定行数据等功能。它本身是一个管道命令,操作文件数据时,先把文件数据的每一行数据放在一个临时的缓冲区,然后再执行指定的操作,最后处理完再把数据显示输出。如果没有指定直接修改的选项,sed是不会改变文件的数据。

sed 的用法格式:

sed [选项] '操作命令' 被操作的文件

例如有一个test.txt的文件,内容如下:

a
b
c
d
e
$
abcdefghijklmnopqrstuvwxyz

想删除文件里的第2和第3行,可以这样写sed:

sed -e '2,3d' ./test.txt

可以看到,文件text.txt原来第2和第3行的数据"b"、"c"是不会显示出来。上面“-e”是选项,“'2,3d'”是操作命令(命令要以两个引号''括住),“./test.txt”是要被操作的文件。

常用的sed选项:

  • -n : (或--quiet或--silent)安静(silent)模式,只显示操作命令处理后的数据,例如要显示第2和第3行数据,可以对比查看“sed -n '2,3p' ./test.txt”跟“sed '2,3p' ./test.txt”的输出区别
  • -e : 后跟操作命令(script),表示以指定的操作命令来处理输入的文件数据,例如上面的:sed -e '2,3d' ./test.txt
  • -f : 把sed的操作命令写在一个文件里, 例如:sed [选项] -f scriptfile filename,-f scriptfile则可以执行scriptfile内的sed操作命令
  • -r : sed的动作支援的是延伸型正则表达式的语法。(预设是基础正则表达式语法)
  • -i : 直接修改读取的文件数据,而不是在屏幕上输出
  • -h : (或--help)显示帮助
  • -V : (或--version)显示版本信息

更多的sed选项信息可以"sed -h"输出查看。

常用的sed操作命令:

a: 新增,a 的后面接要添加的字串,新增在指定行的下一行,例如在第2行后面添加一行“test”:'2a test'

sed '2a just a test' ./test.txt        #第2行后添加字符串"just a test"
sed '1,3a just a test' ./test.txt      #第1行到第3行后增加字符串"just a test"
sed '2a 1row\n2row' ./test.txt         #第2行后增加多行,这里“\n”是换行符

i: 插入,i 的后面接要添加的字串,新增在指定行的上一行,例如在第2行前面添加一行“test”:'2i test'

sed '2i just a test' ./test.txt        #第2行前添加字符串"just a test"

c: 替换,c 的后面接要替换的字串,这些字串可以替换 n1,n2 之间的行,例如将第2、3行内容替换为"bc":'2,3c bc'

sed '2c bbb' ./test.txt         #第2行替换为"bbb"
sed '2,4c bcd' ./test.txt       #第2行到第4行替换为"bcd"

d: 删除,例如删除第2、3行数据'2,3d'(d不接任何字串)

sed '1d' ./test.txt             #删除第1行
sed '2d' ./test.txt             #删除第2行
sed '$d' ./test.txt             #删除最后1行($表示最后1行)
sed '2,3d' ./test.txt           #删除第2行到第3行
nl ./test.txt | sed '2,3d'      #删除第2行到第3行(显示行号)
sed '2,$d' ./test.txt           #删除第2行到最后1行

p: 打印,把操作命令处理过数据打印出来,通常 p 会与参数 sed -n 一起调用,例如显示第2、3行数据:'2,3p'

sed -n '1p' ./test.txt           #显示第1行
sed -n '$p' ./test.txt           #显示最后1行
sed -n '2,3p' ./test.txt         #显示第2行到第3行
sed -n '2,$p' ./test.txt         #显示第2行到最后1行
sed -n '/a/p' ./test.txt         #查找包含关键字a所在所有行
sed -n '/\$/p' ./test.txt        #查找包含关键字$所在所有行,这里反斜线"\"是转义,屏蔽特殊符号

s: 取代,'s/要被取代的字串(这里可以是正则表达式)/新的字串/g',例如把b换成aa:'s/b/aa/g'

sed 's/b/bbbbbbbbbb/g' ./test.txt    #把b取代为bbbbbbbbbb
sed 's/b//g' ./test.txt              #删除b
sed 's/^.*efg//g' ./test.txt         #把abcdefg之前删掉,这里的^表示开头,".*"表示匹配任意字串
sed 's/efg.*$//g' ./test.txt         #把abcd之后的删掉

使用选项"i"直接修改文件:

sed -i 's/c/ccccccc/g' ./test.txt    #把c替换为ccccccc
sed -i '$a end' ./test.txt           #在文件最后1行直接插入"end"
comments powered by Disqus
返回顶部