Linux sed命令详解

Posted 2018-05-9-ygk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux sed命令详解相关的知识,希望对你有一定的参考价值。

Linux sed命令详解

简介
sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送到屏幕。接着处理下一行,这样不断重复,知道文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用自动编辑一个或者多个文件;简化对文件的反复操作;编写转换程序等。

sed使用参数

sed [-nefr] [动作]

选项与参数:
-n:使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来,

-e:直接在命令列模式上进行sed的动作编辑;
-f:直接将sed的动作写在一个文件内,-f filename则可以运行filename内的sed动作;

-r:sed的动作支持的是延伸型正则表达式的语法。(默认是基础正则表达式语法)
-i:直接修改读取的文件内容,而不是输出到终端。

动作说明:[n1,n2] function
n1,n2:不见得会存在,一般代表【选择进行动作的行数】,举例来说,如果我的动作是需要在10到20行之间进行的,则【10,,20[动作行为]】

function:

a:新增 a的后面可以接字符串,而这些字符串会在新的一行出现(目前的下一行)~
c:取代, c的后面可以接字符串,这些字符串可以取代n1,n2之间的行!
d:删除,因为是删除啊,所以d后面通常不接任何咚咚;
i:插入,i的后面可以接字符串,而这些字符串会在新的一行出现(目前的上一行);
p:列印,即将某个选择的数据印出。通常p会参与sed -n一起运行~
s:取代,可以直接进行取代的工作里!通常这个s的动作可以搭配正规表达式法!例如1,20s/old/new/g就是啦!

举例:
一行为单位的新增和删除
①、将/etc/passwd的内容列出来并且列印行号,同时,请将第2~5行删除!

nl /etc/passwd | sed ‘2,5d‘

sed的动作‘2,5d‘,那个d就是删除!因为2~5行给它删除了,所以显示的数据就没有2~5行罗列了,另外,注意一下,原本应该是要下达sed -e才对,没有-e也行了!同时也要注意的是,sed后面接的动作,请务必以‘‘两个单引号括住!

只要删除第2行
nl /etc/passwd | sed ‘2d‘

要删除第3到最后一行
nl /etc/passwd | sed ‘1,$d‘

在第二行(即是加在第三行)加上【drink tea】字样!
nl /etc/passwd | sed ‘2a drink tea‘

那如果是要在第二行前
nl /etc/passwd | sed ‘2i drink tea‘

如果是要增加两行以上,在第二行后面加入两行字,例如
【drink tea or ......】和【drink beer?】

nl /etc/passwd | sed ‘2a Drink tea or ...... drink beer ?‘

每一行之间必须要以反斜杠【】来进行新行的添加!所以,上面的例子中,我们可以发现在第一行的最后面就有存在。

②、以行为单位的替换和显示

将第2~5行的内容取代成为[No 2-5 number]呢?
nl /etc/passwd | sed ‘2,5c No 2-5 number‘

仅列出/etc/passwd文件内的第5·7行
nl /etc/passwd | sed -n ‘5,7p‘

可以通过这个sed的以行为单位的显示功能,就能将某一个文件内的某些行号选择出来显示。

数据的搜索并显示
搜索/etc/passwd有root关键字的行

nl /etc/passwd | sed ‘s/root/p‘
如果root找到了,除了输出所有行,还会输出匹配行。

使用-n的时候将只打印包含模板的行。
nl /etc/passwd | sed -n ‘/root/p‘

数据的搜索并删除
删除/etc/passwd所有包含root的行,其他行删除
nl /etc/passwd | sed ‘/root/d‘

数据的搜索并替换

除了正行的处理模式之外,sed还可以用行为单位进行部分数据的搜索并取代。基本上sed的搜索和替代和vi相当的类似,语法:

sed ‘s/要被取代的字符串/新的字符串/g‘

多点编辑
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell。

nl /etc/passwd | sed -e ‘3,$d‘ -e ‘s/bash/blueshell/g‘

直接修改文件内容(危险动作)
sed可以直接修改文件的内容,不必使用管道命令或者数据流重定向,不过,由于这个动作会直接修改原始的文件,所以请你千万不要随便拿系统配置来测试!我们还是使用下载的regular_express.txt文件来测试看看吧!
sed -i ‘s/.$/!/g‘ regular_express.txt

利用sed直接regular_express.txt最后一行加入【# This is a test】

sed -i ‘$a # This is a test‘ regular_express.txt
由于$代表最后一行,而a的动作是新增,因此该文件最后新增【# This is a test】!
sed的【-i】选项可以直接修改文件内容,这功能非常有帮助!
举例来说,如果你有一个100万行的文件,你要在第100行加某些文字,此时使用vim可能会疯掉的,因为文件太大了,那么怎么办呢?就利用sed啊,通过sed直接修改取代的功能,你甚至不需要使用vim去修订了。

Linux sed命令详解

概述:
sed是stream editor的简称,也就是流编辑器。它一次处理一行内容,处理时, 把当前处理的行存储在临时缓冲区中,称为为“pattern space”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非使用了重定向存储输出。

语法:

sed [option] ‘command‘ input_file

常用选项
    。-n使用安静silent模式。在一般sed的用法中,所有来自stdin的内容一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作才会被列出来)
    。 -e直接在指令模式上进行sed的动作编辑。
    。 -f直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed命令
    。 -r让sed命令支持扩展表达式(默认是基础表达式)
    。 -i 直接修改读取的文件内容,而不是由屏幕输出。

常用命令:
    。a:追加行,a的后面跟上字符串s(多行字符串用
分割),则会在当前选择的行的后面都加上字符串s。

    。c:提换行,c后面跟上字符串s(多行字符串可以用
分割),则会将当前选中的行替换为字符串s。

    。i:插入行,i后面跟上字符串s(多行字符串可以用
分割),则会在当前选中的行的前面都插入字符串s。

    。d:删除行delete,该命令会将当前选中的行删除。
    。y:替换字符,通常y命令的用法是这样的:y/Souse-chars/Dest-chars/,分割字符/可以用任意单字符替换,用Dest=chars中对应位置的字符串替换掉Soutce-chars中对应位置的字符。
    。p:打印print,该命令会打印当前选择的行到屏幕上

    。s:替换字符串,通常s命令的用法是这样的:1,$/Regexp/Replacement/Flags,分隔字符/可以用其他任意字符代替,用Replacement替换掉匹配字符串。


    替换选项:
    。digit:Replacement中可含有后向引用中的digit(digit是1之9),引用前面定义的子表达式
    。&:代表模板空间中的整个匹配部分
    。L:将在其后的替换部分转换成小写字母,直到发现一个U或E,GNU扩展功能
    。l:将下一个字符转换成小写字母,GNU扩展功能
    。U:将在其后的替换部分转换成大写字母,直到发现一个L或E,GNU扩展功能
    。u:将下一个字符转换成大写字母,GNU扩展功能
    。E:停止由L或U指示开始的大小写转换,GNU扩展功能

    标志选项:
    。g:将用Replacement替换模版空间中所有匹配Regexp的部分,则不仅仅是第一个匹配部分
    。digit:只用Replacement替换模版空间中第digit(digit是1至9)个匹配Regexp的部分
    。p:若发生了替换操作,指示显示模版空间中新的数据
    。w file-name:若发生了替换操作,指示将模版空间中新的数据写入指定的文件file-name中
    。i:表示进行Regexp匹配时,是不区分大小写字母的


基本正则表达式

            基本正则表达式(BRE)元字符表

    元字符             说明
    *                   将*前面的正则表达式匹配的结果重复任意次(含0次)。
    +                  与星号(*)相同,只是至少重复1次,GNU的扩展功能。
    ?                  与星号(*)相同,只是最多重复1次,GNU的扩展功能。
    {i}               与星号(*)相同,只是重复指定的i次。
    {i,j}             与星号(*)相同,只是重复i至j次。
    {i, }             与星号(*)相同,只是至少重复i次。
    (regexp)          将regexp看作一个整体,用于后向引用,与digit配合使用。
    .                   匹配任意单个字符。
    ^                   匹配模版空间开始处的NULL字符串。
    $                   匹配的是模版空间结束处的NULL字符串。
    [list]              匹配方括号中的字符列表中的任意一个。
    [^list]             否定匹配方括号中的字符列表中的任意一个。
    regexp1|regexp2    用在相邻的正则表达式之间,表示匹配这些正则表达式中任一个都可以。匹配是从左向右开始的,一旦匹配成功就停止匹配。
    regexp1regexp2      匹配regexp1和regexp2的连接结果。
    digit              匹配正则表达式前半部分定义的后向引用的第digit个子表达式。digit为1至9的数字, 1为从左开始。
    
                  匹配换行符。
    meta               将元字符meta转换成普通字符,以便匹配该字符本身,有$、 *、 .、 [、  和 ^。


    扩展正则表达式
        扩展正则表达式除了以下元字符与基本正则表达式不同外,其余相似。

                        BRE与ERE元字符对应表

            基本正则表达式             扩展正则表达式

                ?                          ?
                +                          +
                |                          |
                { }                       { }
                ( )                       ( )































以上是关于Linux sed命令详解的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习011sed命令详解

linux shell sed命令的问题!

linux之sed命令详解

linux sed命令参数及用法详解

linux sed命令详解(转)

linux下sed命令详解