Sed命令的用法
sed可删除(delete)、改变(change)、添加(append)、插入(insert)、合、交换文件中的资料行,或读入其它档的资料到文>件中,也可替换(substuite)它们其中的字串、或转换(tranfer)其中的字母等等。当sed由标准输入读入一行资料并放入pattern space时,sed依照sed script 的编辑指令逐一对pattern space内的资料执行编辑,之後,再由pattern space内的结果送到标准输出,接着再将下一行资料读入.如此重执行上述动作,直至读>完所有资料行为止。
sed总是以行对输入进行处理
sed处理的不是原文件而是原文件的拷贝
指令格式 :
sed options script file;
script:
用法一:[address1[,address2]]command #指定行执行一个命令时
用法二:[address1[,address2]]{ #指定行执行多个命令时
command1
command2
command3
}
[address1[,address2]]表示命令做作用于文本的某行或某些行。
例:
sed '2s/dog/cat/' data1 #将data1中的第2行中的dot替换为cat
sed '2,4s/dog/cat/' data1 #将data1中的第2~4行中的dot替换为cat
option:
-e script 在处理输入时将script中指定的命令添加到运行的命令中;
例:$ sed -e '
> s/brown/green/
> s/fox/elephant/
> s/dog/cat/ ' filename
-f file 在处理输入时,将file中指定的命令添加到运行的命令中;
例:$ sed -f script1 filename #script1为脚本文件:“sed options script file”中的script
-n 不要为每个命令生成输出,等待print命令来输出,即禁止sed编辑器输出;
-r sed 的动作支援的是延伸型正则表达式的语法。(预设是基础正则表达式语法)
-i 重点内容直接修改读取的文件内容,而不是由屏幕输出
flags
数字:表明新文本将会替换掉第几处模式匹配的地方;
g:表明新文本将会替换掉所有已有文本出现过的地方,如果不添加,就会只会对每行第一次匹配的地方做处理,一般用于字符替换时使用;
p:表明原来行的内容要打印出来;
w file:将替换的结果写到文件中;
function
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(当前行的下一行);
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行;
d :删除, d 后面通常不接其他flags;
i: 插入,插入的文本将插入在指定位置的前面;
$ echo 'Test Line 2'|sed 'i\Test Line 1'
输出:Test Line 1
Test Line 2
p :列印,亦即将某个选择的数据印出。通常 p 会与参数sed -n 一起运行;
s :取代,取代,用新字串替换就字串,arguments可以为:1,20s/old/new/g
s/pattern/replacement/flags
option
{ } 集合有相同位址参数的指令。
! 不执行函数参数。
= 印出资料行数( line number )。
b label 将执行的指令跳至由 : 建立的参考位置。
D 删除 pattern space 内第一个 newline 字母 / 前的资料。
g 拷贝资料从 hold space。
G 添加资料从 hold space 至 pattern space 。
h 拷贝资料从 pattern space 至 hold space 。
H 添加资料从 pattern space 至 hold space 。
l 印出 l 资料中的 nonprinting character 用 ASCII 码。
n 读入下一笔资料。
N 添加下一笔资料到 pattern space。
P 印出 pattern space 内第一个 newline 字母 / 前的资料。
q 跳出 sed 编辑。
r 读入它档内容。
t label 先执行一替换的编辑指令 , 如果替换成牛p>则将编辑指令跳至 : label 处执行。
w 写资料到它档内。
x 交换 hold space 与 pattern space 内容。
y 转换(transform)字元。
实例:
1、删除
(1) sed -e '1d' inputfile #删除第一行
sed -e 'xd' inputfile #删除第x行
sed -e 'x1d' -e 'x2d' -e 'x3d' inputfile #删除第x1,x2,x3行
当然也许还有更好的办法。
(2) sed -e '1,3d' file #删除第一到第三行
sed -e '1,$d' file # 删除第一行到最后一行
(3) sed -e '/#/d' file #删除含有'#'号的行
sed -e '/B/!d' file #除含有字符串B的行全部删除
(4) sed -e '/word1/, /word2/d' file #删除从含有单词word1到含有单词word2的行
(5) sed -e '/t.*t/d' file (删除以t开头以t结尾的行)
2、 替换
Sed 可替换文件中的字串(用s命令)、资料行、甚至资料区(用c命令)。
[address1[ ,address2]] s/pattern/replacemen/[flag]
替换行-c命令
(1) sed -e '1c/#!/bin/more' file #把第一行替换成#!/bin/more
sed -e 'nc/a b c' file #把第n行替换成a b c
(2) sed -e '1,10c/I can do it' file #把1到10行替换成一行:I can do it
sed -e '1,10c/hahaha/nxixixi' file #换成两行hahaha xixixi,换成多行时在每行中间添加行分隔符/n
(3) sed -e 's/string1/& string 2/g' file #在每行中所有出现string1的地方后面添加 string2
[root@localhost shelltest]# cat aa
aaaa
aaa
[root@localhost shelltest]# sed 's/aa/& bbcc/' aa #没有加flag:g 所以只匹配了每行的第一个
aa bbccaa
aa bbcca
替换指定行的内容
sed -e '/machine/s/phi/beta/g' file #将文件中含"machine"字串的行中的"phi"字串,替换成为"beta"字串
sed -e '1,10 s/w1/& w2/g' file #把1到10内的w1字符串替换成w1 w2字符串。
3、插入内容-i命令(当前行的上一行)-a命令(当前航的下一行)
[address1] i/insercontent/[flag]
[address1] a/insercontent/[flag]
sed -e '1i/words' file #在第一行前面插入一行words
sed -e '/aa/i/words' file #在含有aa字串的行前面插入一行words
4 、文本的打印: p,常与-n搭配使用
(1) sed -e '/then/ p' filename #打印所有行并重复打印含有then 的行
(2) sed -n '/then/ p' filename #只打印含有then的行
(3) sed -e '1,3 p' filename # 打印所有行并重复1-3行
(4) sed -n '1,3 p' filename # 打印1-3行
(5) sed -n '/if/,/fi/ p' filename #打印字符if和fi之间的内容
5 、字元的替换: y,以单个字母为单位替换
sed -e 'y/abc../xyz../' filename #把文件中的a字母替换成x, b替换成y, c替换成z。
6 、改变文件中的资料: c
基本格式:
[address1[ ,address2]]c/ filename
函数参数 c 紧接着 “/” 字元用来表示此行结束 , 使用者所输入的资料必须从下一行输入。如果资料超过一行 , 则须在>每行的结尾加入”/”
sed -e '/zhengxh/c hhhh' filename
表示把含有字符串zhengxh的行,该成hhhh。
8、 读入下一行资料: n
[address1[ ,address2]] n
sed -n -e '/echo/n' -e 'p' temp # 表示输出文件,但如果一行含有字符串echo,则输出包含该字符串的下一行。
sed -n -e 'n' -e 'p' filename #输出文中的偶数行
9、命令的复用
一次执行多个命令的方式有三种:
(1) sed 's/w1/& w2/g; 1/i/words' filename (使用;号把命令隔开,注意前面不加-e参数)
(2) sed -e 'cmd1' -e 'cmd2' filename (使用多个-e参数)
参考文档:
http://blog.csdn.net/zg_hover/article/details/1804481
http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html
http://www.cnblogs.com/emanlee/archive/2013/09/07/3307642.html