是对文件中的每一行进行处理,不会对源文件进行修改
sed --version
sed '11d' sed_file
sed -n '/[Bb]erry/p' sed_file (由于设置了n,所以只打印出有Berry/berry的行)
sed '/[Bb]erry/p' sed_file(没有设置n,则会输出所有的行,同时有Berry/berry的行会输出两次)
sed 's/berry/bbery/' sed_file
sed '/^berry/p' sed_file (打印所有以berry开头的那一行)
sed '/[^b]erry/p' sed_file (打印出所有不包含以b开头,并且紧跟着erry的行,这种匹配是根据一个单词来说德)sed -n '/.erry/p/' sed_file (.代表是任意非换行的字符)
x{m} 重复字符X,M次
x{m,} 重复字符X,至少M次
x{m,n}a 重复字符X,至少M次,不多于N 次
sed '/r{2}/p sed_file (匹配2个r,至少有2个r 或 2~10个r 的行)
sed '3,$d' sed_file (删除第3行到最后一行,其他的行被打印)
(..) 保存匹配的字符 s/(love)able/1rs/ 标签标记出来的部分被保存在1号标签中,为了方便在后面引用,使用|来表
示,|将被标签标记出来的模板替换,从表达式的最左边开始,向右最多可以使用9个标签。
例如,love被保存在寄存器1当中,并稍后用做字符串替换。loveable就被替换为lovers 3
#sed -n 's/(Mar)got/1ianne/p' datafile
north NO Marianne Weber 4.5 .89 5 9
说明:
模板Mar 被包含在一对括号内,并在特殊的寄存器中保存为标签1(tag1),它将在后面作为1
替换字符串。Margot替换所有的Marianne。
#sed -n 's/(berry)/1able/gp' sed_file (同理,所有的berry都将被berryable所替换,并打印出这些被处理的行)
#sed 's/berry/&able/gp' sed_file (结果与上相同)
sed 's#3#88#g' datafile (#相当于/,作为搜索字符串和替换字符串的分隔符,默认分隔符是/,但是在s 命令使用
的情况下可以改变。不论什么字符紧跟着s 命令都被认为是新的分隔符。这个技术在搜索包含斜杠
的模板时非常有用,例如搜索时间和路径的时候。)
sed -n'/west/,/east/p' datafile(所有在模板west 和east所确定的范围内的行都被打印。如果west出现在east后面的行中,从west
开始到下一个east,无论这个east出现在那里,二者之间的行都将被打印,即使从west开始到了文件的末尾如果还没有出现east,
那么从west 到末尾的所有的行都将打印。箭头所表示的就是被打印的范围。)
sed '/west/,/east/s/$/**VACA**/' datafile (对于模板east 和west 之间的行,每行的末尾用字符串**VACA**替换,下一行都被移动到该字
符串的后面)
多点编辑:e 命令
sed -e '1,3d' -e 's/Berry/berry/p' sed_file(先删除,后进行字符串替换)
因为两个命令是在同一行执行(也就是说,两个命令都是在当前行的固定空间中执行),所以命令的执行顺序将影响命令的结果。
sed -–expression='s/TB/Tobias/' -–expression='/north/d' datafile
从文件读入:r命令
sed '/Suan/r newfile' datafile
命令 r 表示从文件中读取指定的行。newfile 文件的内容被读入输入文件datafile 中,显示在与
suzan相匹配的行的后面。如果suzan在不止一行中出现,newfile的内容就将显示在所有匹配行的下
面。
写入文件:w命令
sed –n '/north/w newfile2' datafile
命令w表示把一个指定的行写入文件。所有包含north的行都将被写入名为newfile2的文件中。
追加:a 命令(a)
sed '/^north /a\
--->THE NORTH SALES DISTRICT HAS MOVED<---' datafile
命令a表示追加。字符串--->THE NORTH SALES DISTRICT HAS MOVED <---将被追加到以
north开头,且north后面有空格的行的后面。需要被追加的文本必须写在命令行中追加命令的后面。
sed要求在命令a后面有一个反斜杠。第二个反斜杠表示在TC Shell下转义换行符,这样才能在
下一行完成引用。a如果被追加的不止一行,除了最后一行,每一行也都要用反斜杠结束。
插入:i命令
sed '/eastern/i\
NEW ENGLAND REGION
--------------------------------' datafile
命令 i 是插入命令。如果模板eastern 被匹配,i 命令就把反斜杠后面的文本插入到包含eastern
的行的前面。除了最后一行,每一行插入完成后都需要反斜杠(额外的反斜杠是用来满足TC Shell
的要求的)。
下一个:n命令
sed '/eastern /{ n; s/AM/Archie/; }' datafile
如果模板eastern 匹配了某一行,n 命令就移动到输入文件中该行的下一行,替换这一行的模式
空间。即用Archie替换AM,打印该行,然后再继续。
变形:y命令
sed '1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKL
MNOPQRSTUVWXYZ/' datafile
对于1~3行,y命令把所有的小写字符转变为大写字符。正则表达式元字符不能使用这个命令。
退出:q命令
sed ‘5q' sed_file
sed '/Lewis/{ s/Lewis/Joseph/;q; }' datafile(在Lewis匹配的行,先用Joseph替换Lewis,然后退出sed程序)
保持和获取:h命令和g命令
sed -e '/northeast/h' -e '$G' datafile (如果有多行northeast匹配,那么只会把最近的保存进保持缓冲区的字符串追加到模式空间中)
在sed处理的文件的时候,每一行都被保存在一个叫作模式空间(pattern space)的临时缓冲区
中。除非行被删除或者输出被取消,否则所有被处理过的行都将打印在屏幕上。接着模式空间被清
空,并存入新的一行等待处理。在这个例子中,包含模板的northeast 行被找到,并被放入模式空间
中,h命令将其复制并存入一个称为保持缓冲区(holding buffer)的特殊缓冲区内。在第二个sed 结
构中,当达到最后一行后,G命令告诉sed 从保持缓冲区中取得该行,然后把它放回到模式空间中,
且追加到现在已经存在于模式空间中的行的末尾——在这个例子中,就是追加到最后一行。简单来
讲:任何包含模板northeast 的行都将被复制并追加到该文件的末尾。
sed -e '/northeast/h' -e '$g' datafile (g和G的区别,g 会替换掉最后一行,而G是追加到其后面)
h命令和x命令
sed –e '/patricia/h' -e '/Margot/x' datafile
命令x表示互换模式空间和保持缓冲区的内容。当模板patricia被匹配,该行将被保存到保持缓
冲区中。当包含Margot 的行被找到,模式空间将与保持缓冲区交换彼此的行。简单地说,就是包含
Margot的行被包含patricia的行替换了。
-f sed 脚本
sed -f scrript_file sed_file
sed –n 'l' sed_file 打印所有包含不能打印字符的行