Learn sed using these command on Linux(流线式编辑器——sed)

是对文件中的每一行进行处理,不会对源文件进行修改

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 打印所有包含不能打印字符的行

 

posted @ 2016-07-03 17:01  Big_Foot  阅读(252)  评论(0编辑  收藏  举报