sed命令
sed是一个非交互式文本编辑器。它编辑文件或者从标准输入导出的文本拷贝。
调用sed
不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件, sed从标准输入中接受输入,一般是键盘或重定向结果。
方式1
命令行格式:实际命令用单引号(‘’)或者双引号(“”)引起来
sed [option] command input-files
方式2
使用sed脚本:
sed [option] -f sed_script input-files
方式3
使用第一行有sed解释器的脚本:
sed_script [option] input-files
sed在文件中查找文本的方式
sed浏览输入文件时,缺省从第一行开始,有两种方式定位文本:
1) 使用行号,可以是一个简单数字,或是一个行号范围。
2 ) 使用正则表达式。
基本sed编辑命令
例子
使用p(rint)显示行
// 只打印第二行
sed -n '2p' quote.txt
// 打印范围
sed -n '1,3p' quote.txt
// 打印模式,匹配单词并打印此行
sed -n '/music/'p quote.txt
// 使用行号和模式进行查询
sed -n '4,/The/'p quote.txt
// 使用\屏蔽特殊含义以匹配元字符
sed -n '/\$/'p quote.txt
// 打印整个文件,以下两条命令好像并没有什么区别
sed -n '1,$p' quote.txt
sed -n '1,$'p quote.txt
// 匹配任意字符
sed -n '/.*ing/'p quote.txt
// 打印首行
sed -n '1p' quote.txt
// 最后一行
sed -n '$p' quote.txt
// 打印行号,使用等号 =,打印模式匹配的行号,使用格式/pattern/=,其中-n只显示行号,-e显示行号和整行内容。
sed -n '/music/=' quote.txt
sed -e '=' quote.txt
// 如果只打印匹配行和行号,使用模式 sed -n -e '/pattern/p' -e '/pattern/=' input-files
sed -n -e '/music/p' -e '/music/=' quote.txt
附加文本
要附加文本,使用符号a \,可以将指定文本一行或多行附加到指定行。。如果不指定文本放置位置, sed缺省放在每一行后面。附加文本时不能指定范围,只允许一个地址模式。文本附加操作时,结果输出在标准输出上。注意它不能被编辑,因为sed执行时,首先将文件的一行文本拷贝至缓冲区,在这里sed编辑命令执行所有操作(不是在初始文件上),因为文本直接输出到标准输出,sed并无拷贝。
要在附加操作后编辑文本,必须保存文件,然后运行另一个sed命令编辑它。这时文件的内容又被移至缓冲区。
1、附加操作格式如下:地址指定一个模式或行号,定位新文本附加位置。a\ 通知sed对a \后的文本进行实际附加操作。观察格式,注意每一行后面有一斜划线,这个斜划线代表换行。sed执行到这儿,将创建一新行,然后插入下一文本行。最后一行不加斜划线, sed假定这是附加命令结尾。
输出显示附加结果。如果要保存输出,重定向到一个文件。
[address]a\
text\
text\
...
text
sed /company/a\ Then\ suddenly\ it\ happend. quote.txt > new_quote.txt
2、插入文本:插入命令类似于附加命令,只是在指定行前面插入。和附加命令一样,它也只接受一个地址。下面是插入命令的一般格式。地址是匹配模式或行号。
也可以使用行号指定文本插入位置,插入位置在模式或指定行号4之前。
sed ‘4’i\ Then\ suddenly\ it\ happend. quote.txt
修改文本
修改命令将在匹配模式空间的指定行用新文本加以替代。格式如下:
[address[,address]]c\
text\
text\
...
text
替换某一行(第三行):
sed '3'c\ The\ Office\ Dibble\ band\ played\ well. quote.txt
可以对同一个脚本中的相同文件进行修改、附加、插入三种动作匹配和混合操作。
#!/bin/sed -f
#This is a command line,all command starts with a #
#name: mix.sed
#change first line
1 c\
The Dibble band were grooving.
#let's now insert one line
/evening/ i\
They play some great tunes.
#change the last line
$ c\
That's all.Thank you!
#stick in a new line
3 a\
Where was the nurse to help?
删除文本
sed删除文本格式,其中地址可以是行的范围或模式:
[address[,address]] d
sed '1d' quote.txt
sed '1,3d' quote.txt
sed '$d' quote.txt
sed '/Jerry/d' quote.txt
替换文本
替换命令用替换模式替换指定模式:
[address[,address]] s/old_pattern/new_pattern/ [g p w n]
g 缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现的模式。
p 缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效,-n选项不打印输出结果。
w 文件名 使用此选项将输出定向到一个文件
例如
//修改文本,源文件不变,如果要修改源文件,使用-i选项
sed 's/night/NIGHT/' quote.txt
sed -i 's/night/NIGHT/' quote.txt
// 删除特殊符号,注意转义
sed 's/\$//' quote.txt
// 全局替换
sed 's/The/WOW!/g' quote.txt
// 使用w选项,注意将输出文件名包含在单引号里。
sed 's/splendid/SPLENDID/w sed.out' quote.txt
使用替换修改字符串
如果要附加或修改一个字符串,可以使用(&)命令,&命令保存发现模式以便重新调用它,然后把它放在替换字符串里面。说白了&就代表着要被替换的文本。
sed -n 's/nurse/"Hello" &/p' quote.txt
将sed结果写入文件命令
[address[,address]]w filename
sed '1,2 w filedt' quote.txt
sed '/Neave/ w file' quote.txt
从文本中读文本
处理文件时, sed允许从另一个文件中读文本,并将其文本附加在当前文件。此命令放在模式匹配行后,格式为:
address r filename
//将文件sed.txt加入到quote.txt文本的company后面,并打印到标准输出,不改变源文件。
sed '/company/ r sed.txt' quote.txt
匹配后退出
查询首次出现模式,然后退出。需要将q放在sed语句末尾。
sed '/jerry/q' quote.txt
显示文件中的控制字符
sed格式为,l 意为列表:
[address[,address]]l
sed -n '1,$l' func.txt