shell之sed基本用法

1.sed介绍及工作流程

    很多时候我们在linux下面都需要去编辑一些文件。我们所使用的编辑器一般都是vi/vim。vim属于屏幕编辑器,所谓屏幕编辑器是说,我们编辑一个文件的时候,需要把这个文件打开,这里面存在两个问题:1.因为我们需要把这个文件打开,所以如果说一个比较大的文件的话,将会消耗很多的内存 2.当我们在编辑文件的时候,必须要互动,这样的话,如果我们在写脚本的时候,是很难调用vim。这个时候我们就需要使用其他的编辑器,sed就是其中一种。

    sed属于流编辑器,所谓的流编辑器是这样,sed在编辑文件的时候,首先会把文件的一行内容读到内存,然后根据我们的需要来进行编辑。读入到内存的这部分,我们称作是模式空间,修改完,会把模式空间的内容输出到屏幕,然后把模式空间里面的内容清空。读取下一行到模式空间。这样的话就避免了一次性读取整个的文件。

2.sed的基本命令

    sed的语法是:

sed [options] 'range command' file

如果说范围我们没有指定的话,那么将会对全文每行进行操作。

有时候我们需要指定范围操作,指定范围的方法有两种:

1.直接写一个数字,表示对多少行进行操作


sed  '2d' file1命令对file1的第二行进行操作,d表示删除的命令

2.第二种指明范围的方法是正则表达式,如果我们使用正则表达式来表示范围的话,必须要使用//来隔开,比如:


sed '/^1/d' file1命令的意思是删除以1开头的行,其中^1的正则表达式必须以/reg/的形式隔开


以上我们是对单行来进行操作的,我们也可以对多行进行操作:


删除了第一行和第二行。除了用数字表示范围之外,还可以:


删除第一次包含name1的行到第一次包含name2的行之间的所有行。

上面介绍了d删除命令,还有其他命令,我们再看一下s命令,是替代的意思:

使用的格式为:sed    'range s/老字符/新字符/标记'    file

如果没有指定范围的话,将会对所有行进行操作。


上面的命令会把file1文件中的所有name,替换成NAME。因为没有指定任何的标记,所以它只会对每行的第一个关键字操作(替换),如果说我们想替换所有的,或替换个别的话,我们可以使用标记:


上面的命令使用了标记g,表示替换每行所有的关键字。

如果想替换第二个或者第三个呢?如下:


上面的命令,指定的标记2,替换了每行的第2个关键字。

sed    'range s/老字符/新字符/标记'    file

在这里,老字符是支持正则表达式的,但是在新字符的位置是不支持正则表达式的,没有什么特殊字符除了\n,\,&。


在上面的命令中,&表示前面的关键字。


如果说我们对特定的范围做多个操作的话,那么我们需要把多个操作用{}括起来,用;隔开多个命令


上面的命令,我们先对第一行所有的name替换为NAME,然后对第一行第二个NAME替换为xxx。

上面我们已经讲了一些操作,从这些操作中我们可以看到,sed读取文件的一行,然后操作,操作完成之后,

会把结果显示在屏幕中,如果说我们想查看模式空间里面的内容的话,可以使用p。


前面第一个命令,会显示模式空间和正常的输出内容,如果只要看模式空间的内容,可以加-n的选项。


刚才我们讲的是替换一个单词,如果说我们想替换单个字符的话,我们可以使用y命令。


上面的命令的意思是,N字符替换第一行出现的n字符,A字符替换第一行出现的a字符。


以上讲了三个命令,d,s,y

还有一些简单的命令:

a\ 意思是追加,在关键词后面一行加上一行内容:


上面这个命令表示,在第三行后面加上a\后面的内容,内容加在新一行。

如果在指定行的前面一行新加内容,可以使用i\命令:


如果想修改一行的内容可以用c命令,c命令也是替换的意思


上面的命令是用c命令把包含name3的行,替换成了c后面的内容。

大家要记住一点,以上我们所做的所有的操作都是在模式空间里面做,并没有改变源文件的内容。

如果说我们要改变源文件的话,只要对sed加上-i选项就可以了:


当加上-i选项后,屏幕上并没有任何输出,因为这样操作的话,它直接改变了源文件的内容。后面可以看到,源文件的内容

确实发生了变化。


猜你喜欢

转载自blog.csdn.net/worldchinalee/article/details/80143596
今日推荐