精华内容
下载资源
问答
  • 使用sed脚本文件格式为:sed[options] -f sed脚本文件 输入文件 sed脚本文件[options] 输入文件 --不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向...
    调用sed的三种方式
    使用sed命令行格式为:sed [options] sed命令 输入文件
    使用sed脚本文件格式为:sed[options] -f sed脚本文件 输入文件
    sed脚本文件[options] 输入文件
    --不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。
    (2)sed 命令的options如下
    -n:不打印
    -c:下一命令是编辑命令
    -f:如果正在调用sed脚本文件
    (3)sed在文件中查询文本的方式
    --使用行号,可以是一个简单的数字,或是一个行号的范围
    --使用正则表达式
    (4)读取文本的方式 
    x x为一行号
    x,y 表示行号范围从x到y
    /pattern/ 查询包含模式的行
    /pattern/pattern/ 查询包含两个模式的行
    pattern/,x 在给定的行号上查询包含模式的行
    x,/pattern/ 通过行号和模式查询匹配行
    x,y! 查询不包含指定行号x和y的行
    (5)基本sed编辑命令
    p 打印匹配行
    d 删除匹配行
    = 显示文件行号
    a\ 在定位行号后附加新文本信息
    i\ 在定位行号后插入新文本信息
    c\ 用新文本替换定位文本
    s 使用替换模式替换相应模式
    r 从另一个文件中读文件
    w 写文本到一个文件
    q 第一个模式匹配完成后推出或立即退出
    l 显示与八禁止ASCII代码等价的控制字符
    {} 在定位行执行的命令组
    n 从另一个文件中读文本下一行,并附加在下一行
    g 将模式2粘贴到/pattern n/
    y 传送字符
    (6)举例说明:
    sed -n '2p' test.txt 打印第二行的信息(注意:-n是不打印不匹配的信息,若没加-n,则打印文件的所有信息而不是匹配信息)
    sed -n '1,4p' test.txt 打印第一行到第四行的信息
    sed -n '/los/p' test.txt模式匹配los,并打印出来
    sed -n '2,/los/p' test.txt 从第二行开始。。知道匹配第一个los
    sed -n '/^$/p' test.txt 匹配空行
    sed -n -e '/^$/p' -e '/^$/=' test.txt 打印空行及行号
    sed -n '/good/a\morning' test.txt 在匹配到的good后面附加morning
    sed -n '/good/i\morning' test.txt 在匹配到的good前面插入morning
    sed -n '/good/c\morning' test.txt 将匹配到的good替换成morning
    sed '1,2d' test.txt 删除第1和2行
    sed 's/good/good morning/g' test.txt 匹配good并替换成goodmorning
    send 's/good/& hello /p' test.txt 匹配到good就在其后面加上hello
    send 's/good/ hello &/p' test.txt 匹配到good就在其前面加上hello
    6.合并与分割(sort,uniq,join,cut,paste,split)
    展开全文
  • linux下SED脚本参考

    2018-02-04 12:50:04
    SED单行脚本快速参考(Unix 流编辑器) sed命令使用说明
  • 编写sed脚本

    2017-11-13 15:33:00
    sed命令 在脚本中应用命令: 替换命令 s/pig/cow/g s/cow/horse/g 模式空间 sed维护一种模式空间,即一个工作区或者临时缓冲区...屏幕编辑程序必须将整个文件读入内存,这将会产生内存溢出或者在处理庞大的文件时速...

    sed命令

    在脚本中应用命令:

    替换命令

     s/pig/cow/g

     s/cow/horse/g

    模式空间

    sed维护一种模式空间,即一个工作区或者临时缓冲区,当应用编辑命令时,将在那里存储单个输入行。

    注意:一次一行的设计的一个优点是sed在读取非常大的文件时不会出现问题。屏幕编辑程序必须将整个文件读入内存,这将会产生内存溢出或者在处理庞大的文件时速度非常慢。

    寻址上的全局透视

    sed是隐式全局的,例如下面的替换命令,将每个"CA"替换成"California"

    s/CA/Californai/g

    我们也可以限制只对包含"Sebastopol"的行才将"CA"替换为"California"

    Sebastopol/s/CA/California/g

    由“Sebastopol”“CA”组成的输入行将匹配这个地址,并且应用替换命令将他替换为“Sebastopol”“California”. 右“San Fracicso”“CA”组成的行不会被匹配,而且不会应用替换命令。

    sed命令可以指定零个、一个或两个地址。每个地址都是一个描述模式。行号或者行寻址符号的正则表达式。

    注意:

    1、如果没有指定地址,那么命令将应用于每一行。

    2、如果只有一个地址,那么命令应用于与这个地址匹配的任意行。

    3、如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址的第一行,和他后面的行,直到匹配第二个地址的行。

    4、如果地址后面跟有感叹号(!),那么命令就应用于不匹配该地址的所有行。


    删除命令d
    1.一个只有d命令组成,并且没有地址的脚本不会产生输出,因为它删除了所有的行。
    2.当行号作为一个地址提供时,命令只影响那一行,例如:1d ,删除最后一行,使用$d
    3.当正则表达式作为地址提供时,这个命令只影响与这个模式匹配的行。正则表达式必须封闭在(/)中,下面的删除命令为"/^$/d" :只删除空行。
    4.如果提供了两个地址,那么就指定了命令执行的行范围。下面展示了如何删除由一对宏包围的所有行,在这种情况下,.TS和.TE标记了tb1的输入:/^\.TS/,/^.TE/d 

          注意:它删除了从第一种模式匹配的行开始,到由第二种模式匹配的行(包括此行在内)为止的所有的行这个范围的行不受影响。

    5.下面的命令删除了文件中从行50到最后一行的所有行:50,$d

    可以混合使用行地址和模式地址:1,/^$/d 这个示例删除了从第一行直到第一个空行的所有的行,例如,可以用他来删除保存在文件中的Internet邮件消息中的邮件头。

    注意:1.可以把第一个地址看做是启用地址,并把第二个地址看成是禁用动作,sed没有办法先行决定第二个地址是否会匹配。一旦匹配了第一个地址,这个动作就将应用于这些行。于是命令应用于“所有”随后的行,直到第二个地址被匹配。,在上例中,如果文件不包含空行,那么将删除所有的行。

    2.跟在地址后面的感叹号会反转匹配的意义。例如,下面的脚本将删除在tb1输入块中的那些行以外的所有行。/^\.TS/,/^.TE/!d

    命令分组

    1.sed使用大括号({})将一个地址嵌入在另一个地址中,或者在相同的地址上应用多个命令。如果想指定行的范围,然后在这个范围内指定另一个地址,则可以嵌套地址。例如:为了只删除tb1输入块中的空行,使用下面的命令:/^\.TS/,/^\.TE/{

    /^$/d

    }

    注意:左大括号必须在行末,而且右大括号本身必须单独占一行,并且确保在大括号之后没有空格。

    2.可以使用大括号将编辑命令括起来对某个范围的行应用多个命令,如下所示:

    /^\.TS/,/^\.TE/{

    /^$/d

    s/^\.ps 10/.ps 8/

    s/^\.vs 12/.vs 10/

    }

    注意:这个示例不仅删除了tb1输入块中的空行,而且他还使用了替换命令s,改变了几个troff的请求,这些命令只应用于.TS/.TE块中的行。


    测试并保存输出

    在前面关于模式空间的讨论中,可以看到sed:

    1. 生成输入行的备份

    2. 修改模式空间中的备份

    3. 将备份输出到标准输出

    这些都意味着sed有其内置的安全措施,所以会改变原始的文件。因此,下面的命令行:

    sed -f sedscr testfile:不会在testfile中做改动。它将所有的行送往标准输出(一般指屏幕),----包括被修改的行和没有被修改的行。如果想要保存这些输出,就必须将他们输入到一个新的文件中。

    sed -f sedscr testfile  > newfile 其中,重定向符号">"将来自sed的输出直接送往文件newfile中。不要将来自命令的输出重定向到输入文件,否则会改写输入文件,甚至可能在sed处理这个文件之前,并破坏你的数据。

    检查newfile和testfile文件的差别:

    diff testfile  newfile


    sed脚本的四种类型

    1.对同一文件的多重编辑:sed脚本的第一种类型示范了在一个文件中进行一系列编程工作。我们使用的第一个示例是将由字处理程序创建的文件转换为用于troff的编码文件。

    下面是Horsefeathers Software 产品说明显然需要做的一个编辑工作的列表:

    a.用段落宏(.LP)取代所有的空行。要求是匹配空行,但是,在查看输入文件内容时,空行是否有前导空格并不明显。当清楚空格后,它们没有前导空格,所以空行可以采用模式“^$”来匹配。(如果行上有空格,那么模式写成“^[]*$*”)。因此,可以用以下的方法简单的实现:

    [root@localhost sed]# cat horse.txt 
    HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
    + _______________
    BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO.  These software products can fill your 

    requirements for powerful ,sophisticated,        general-purpose business software providing you with a base for software customization or development.
    Horsefeathers BASIC is BASIC optimized for use on the BigOne machine with UNIX or MS-DOS operating systems. BASIC Librarian is a full screen program editor, which also provides the ability

    [root@localhost sed]# sed 's/^$/.LP/' horse.txt 
    HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
    + _______________
    BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO.  These software products can fill your 
    .LP
    requirements for powerful ,sophisticated,        general-purpose business software providing you with a base for software customization or development.
    Horsefeathers BASIC is BASIC optimized for use on the BigOne machine with UNIX or MS-DOS operating systems. BASIC Librarian is a full screen program editor, which also provides the ability 

    's/^$/.LP/' 注意:用'.LP'来取代每个空行。在替换命令的替换部分不必转义字母句点。


    b.我们的第二个编辑操作是删除以"+"开始并且包含行式打印机下划线的行。此处可以用删除命令d只删除这一行。在编写匹配这一行的模式中,我们可以有许多中不同的选择,如下的多种形式都可以匹配这一行。

    /^+/

    /^+[空格]/

    /^+[空格][空格]*/

    /^+[空格][空格]*—*/

    可以看出,每个正则表达式一次匹配的字符越来越多。只有通过测试才能决定需要多复杂的表达式来匹配特定的行而不是其他的行。在正则表达式中定义的模式越长,就越容易使他不会产生不想要的匹配。so,我们选择了第三种表达式:

    [root@localhost sed]# sed '/^+  */d' horse.txt 
    HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
    BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO.  These software products can fill your 

    requirements for powerful ,sophisticated,        general-purpose business software providing you with a base for software customization or development.
    Horsefeathers BASIC is BASIC optimized for use on the BigOne machine with UNIX or MS-DOS operating systems. BASIC Librarian is a full screen program editor, which also provides the ability
     

    /^+[空格][空格]*/ 

    注意:这个命令删除以加号开始并且后面跟有至少一个空格的任意行。模式中指定两个空格。但是第二个可能每个 由“*”号修饰,意味着第二个空格可以有也可以没有。

    c.删除在行开始位置填充的空格。匹配序列的模式如下:

    s/^[空格][空格]*// 

    注意:这个命令删除在行的开头发现的任意空格序列。替换命令的替换部分为空,这意味着删除了被匹配的字符串。

    eg:

    [root@localhost sed]# sed 's/^  *//' horse.txt 
    HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
    + _______________

    BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO.  These software products can fill your 

    requirements for powerful ,sophisticated,general-purpose business software providing you with a base for software customization or development.Horsefeathers BASIC is BASIC optimized for use 
    on the BigOne machine with UNIX or MS-DOS operating systems. BASIC Librarian is a full screen program editor, which also provides the ability 

    d.处理为了对齐而添加的额外空格。我们可以编写一个替换命令匹配任意连续空格字符串并用一个空格取代他。

    s/ [空格][空格] */[空格]/g 

    注意:在命令的结尾添加全局标志以便取代所有的出现(不只是第一个),注意,和前面的正则表达式一样,我们不能指定有多少空格,可能有一个或者多个,不管有多少,都将他们缩减为一个空格。

    友情提示:这个命令还匹配单个空格。但是因为替换的命令也是一个空格,因此有一种情况是实际上“没有工作”。

    命令测试:

    [root@localhost sed]# sed -e 's/  */ /g'  horse.txt 
    HORSEFEATHERS SOFTWARE PRODUCT BULLETIN DESCRIPTION
    + _______________

     BigOne Computer offers three software packages from the suite of Horsefeather software products -- Horsefeathers Business BASIC Librarian, and LIDO. These software products can fill your 

    requirements for powerful ,sophisticated,general-purpose business software providing you with a base for software customization or development.Horsefeathers BASIC is BASIC optimized for use 
     on the BigOne machine with UNIX or MS-DOS operating systems. BASIC Librarian is a full screen program editor, which also provides the ability 

    上述的表达式有弊端。因为该表达式删除了跟在句点后的两个空格序列,而在这里本应该有两个空格。

    so,为了完善替换命令以便他不会替换掉句点后面的空格,问题时句点后面也可能跟有3个空格,则需要将他们删除为2个空格。因此,表达式如下:

    s/\.[空格][空格]*/.[空格][空格]/g  此命令可以简化为: s/\.[空格]/[空格][空格]/g

    注意:这个命令用后面跟有两个空格的句点,替换了后面跟有任意空格的句点。


    总结:

    s/^$/.LP/

    /^+[空格][空格]*/d

    s/^[空格]*//

    s/[空格][空格]*/[空格]/g

    s/\.[空格][空格]*/.[空格][空格]/g


    提取宏定义

           troff宏在宏包中进行定义,它通常是存放在某个目录(例如:/usr/lib/macros)下的一个文件中。troff宏定义总是以字符串'.de'开始,后面跟有可选的空格或者是由一个或者两个字母构成的宏的名字。宏定义在两个句点(..)开始的行处结束。本节的内容是从一个宏包中提取特殊的宏定义(它可以节省你用编辑器定位并且打开文件和搜索想要检查的行的时间)。

        设计此脚本的第一步是:编写提取指定宏的部分。

    eg:[root@localhost sed]# sed -n '/^\.deBL/','/^\.\.$/p' /usr/lib/macros/mmt

    解释:可以用-n选项来调用sed从而阻止他打印整个文件,使用这个选项,sed只打印通过打印命令显示指定要打印的行。sed脚本包含两个地址:第一个匹配宏定义的开始'.deBL',第二个匹配它的终端,"..",(它自成一行).注意:这两个模式中出现的句点用反斜杠转义。并且这两个地址指定了打印命令p的行范围,这就是搜索脚本与grep(不能匹配行的范围)功能的区别。


    在shell脚本中可以使用位置符号来指定命令行上的每个参数:第一个参数是$1,第二个参数是$2.以此类推。

    sed -n "/^\.de$1/,/^\.\.$/p" /usr/lib/macros/mmt注意:括住sed脚本的双引号是必须的。如果使用单引号,则shell不对“$1”进行解释。

    例子:此脚本可以处理任意个宏包,下面的getmac版本允许用户将宏包的名字指定为第二个命令行参数。

    [root@localhost sed]# cat getmac
    #!/bin/bash

    #getmac - read macro definition for $1 from package $2

    file=/usr/lib/macros/mmt
    mac="$1"
    case $2 in 
    -ms) file="/work/macros/current/tmac.s";;
    -mm) file="/usr/lib/macros/mmt";;
    -man) file="/usr/lib/macros/an";;
    esac
    sed -n "/^\.de  *$mac/,/^\.\.$/p" $file

    解释:这里的新内容是case语句,它用于测试$2的值并随后给变量file赋一个值。注意:首先给file赋了一个默认的值。所以如果用户没有指定宏包,那么就会搜索-mm宏包。而且,为了清楚,易懂,$1的值被赋值给了mac。

    /^\.de  *$mac/:“.de”和宏的名字之间指定了一个空格,后面跟有一个星号,这意味着这个空格是可选的。


    生成提纲

    文档例子:

    [root@localhost sed]# cat outline.txt 
    A. Shell Programming
    B. Stored Commands
    B. Passing Arguments to Shell Scripts
    B. Conditional Execution
    B. Discarding Used Arguments
    B. Repetitive Execution
    B. Setting Default Values
    B. What We've Accomplished

    此脚本需要匹配以下面的宏开始的行

    ** 章标题(.Se)

    ** 节标题(.Ah)

    ** 子节标题(.Bh)

    如果我们需要在那些行上进行替换,用文本标记(例如:A、B)取代宏并添加适当数量的空格(使用制表符)来缩进每个标题。(记住:"."表示一个制表符)。

    s/ "//g         s/[{}]//g

    指定全局标志g来捕获一行上的所有出现是必要的。然而,关键是将这个脚本放在脚本的什么位置。如果我们将他放在脚本的结尾,那么它将在输出行之后删除引号。我们必须将他放在脚本的起始位置并针对多有的行进行修改,不管他们之后是否在脚本中输出。


    编辑工作转移

    sed作为真正的流程编辑器,在管道中进行编辑操作,这些编辑操作永远不会被写回到文件中。

    下面的命令时将两个连续的破折号转为一个长破折号。

    s/--/\\(em/g

    我们在替换字符中用两个反斜杠来表示\(em。因为反斜杠在sed中有特殊的含义。


    /---/!s/--/\(em/g        /---/!s/--/\(em/g  file | troff

    解释:如果找到含有3个连续的连字符的行,不应用此编辑操作。在所有的其他行上,应用替换命令。后一个表达式的意思是:改变了输入文件并且将输出直接传递到troff,而不用创建一个中间文件。

    当一个文档排版时,将连字符换成长破折号不是唯一要做的美化工作。在troff中,可以通过键入两个连续的重音符或者“反引号('')”来表示左引号。键入两个连续的单引号('')来标识右引号。我们可以使用sed将每个双引号字符换成一个单个的左引号或者单个的有引号。也就是说,当排版时,产生合适的“双引号”。










    本文转自 妙曼  51CTO博客,原文链接:http://blog.51cto.com/yanruohan/1902746,如需转载请自行联系原作者
    展开全文
  • sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 二、sed的工作流程 sed 的工作流程主要包括读取、执行和显示三个过程: 读取:sed 从输入流

    sed工具(编辑脚本神器!)


    sed编辑器

    一、sed概念

    sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。

    sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

    二、sed的工作流程

    • sed 的工作流程主要包括读取、执行和显示三个过程:
      读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
      执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行。
      显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

    在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
    注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。

    三、sed命令格式

    • 命令格式
    格式1:sed  -e  ‘操作’  文件1 文件2 ......
    
    格式2:sed  -n -e  '操作'   文件1  文件2 .......
    
    格式3:sed  -f  脚本文件   文件1  文件2 .......
    
    格式4:sed  -i  -e  '操作'  文件1  文件2.......
    
    格式5:
    sed  -e  'n{
    操作1 
    操作2 
    .......
    }'  文件1  文件2......
    
    • 常用选项
    -e 或--expression=:表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
    -f 或--file=:表示用指定的脚本文件来处理输入的文本文件。
    -h 或--help:显示帮助。
    -n、--quiet 或 silent:禁止sed编辑器输出,但可以与p命令一起使用完成输出。
    -i:直接修改目标文本文件。
    
    • 常用操作
    s:替换,替换指定字符。
    d:删除,删除选定的行。
    a:增加,在当前行下面增加一行指定内容。
    i:插入,在选定行上面插入一行指定内容。
    c:替换,将选定行替换为指定内容。
    y:字符转换,转换前后的字符长度必须相同。
    p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
    =:打印行号。
    l(小写L):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
    

    四、sed命令的使用方式

    1.打印内容

    ①不加-n时,sed编辑器也会打印一次

    [root@localhost ~] # vim shuzi.txt
    [root@localhost ~] # cat shuzi.txt 
    one
    two
    three
    four
    five
    [root@localhost ~] # sed 'p' shuzi.txt 
    one
    one
    two
    two
    three
    three
    four
    four
    five
    five
    [root@localhost ~] # sed -n 'p' shuzi.txt 
    one
    two
    three
    four
    five
    

    ②打印行号,如果加上-n,就限制了sed编辑器的输出,看不到内容

    [root@localhost ~] # sed '=' shuzi.txt
    1
    one
    2
    two
    3
    three
    4
    four
    5
    five
    [root@localhost ~] # sed -n '=' shuzi.txt
    1
    2
    3
    4
    5
    

    ③通过使用“;”或-e来执行多个操作命令

    [root@localhost ~] # sed -n '=;p' shuzi.txt
    1
    one
    2
    two
    3
    three
    4
    four
    5
    five
    [root@localhost ~] # sed -n -e '=' -e 'p' shuzi.txt
    1
    one
    2
    two
    3
    three
    4
    four
    5
    five
    

    补充:单引号“’’“后直接回车

    [root@localhost ~] # sed -n '
    > =
    > p
    > ' shuzi.txt
    1
    one
    2
    two
    3
    three
    4
    four
    5
    five
    

    ④打印ASCII字符

    [root@localhost ~] # sed -n 'l' shuzi.txt 
    one$
    two$
    three$
    four$
    five$
    

    2.使用地址

    • sed编辑器有2种寻址方式:
      • 以数字形式表示行区间
      • 用文本模式来过滤出行

    ①打印行

    [root@localhost ~] # sed -n '1p' shuzi.txt #打印第一行
    one
    [root@localhost ~] # sed -n '$p' shuzi.txt #打印最后一行
    five
    [root@localhost ~] # sed -n '1,3p' shuzi.txt #打印1到3行
    one
    two
    three
    [root@localhost ~] # sed -n '3,$p' shuzi.txt #打印3到最后一行
    three
    four
    five
    
    [root@localhost ~] # sed -n '1,+3p' shuzi.txt #打印包括1之后的连续3行
    one
    two
    three
    four
    [root@localhost ~] # sed '5q' shuzi.txt #输出5行以后退出
    one
    two
    three
    four
    five
    

    ②打印奇数行
    第一步:sed读取第一行,p打印出来
    第二步:这里n表示移动到下一行(此时是第二行)
    第三步:sed命令结束,再次切换到下一行(此时是第三行)
    第四步:重复一二三的步骤,直至最后一行

    打印偶数行是‘n;p’与打印奇数行同理

    [root@localhost ~] # sed -n 'p;n' shuzi.txt #打印奇数行
    one
    three
    five
    [root@localhost ~] # sed -n 'n;p' shuzi.txt #打印偶数行
    two
    four
    [root@localhost ~] # sed -n '2,${n;p}' shuzi.txt #打印从2开始的奇数行
    three
    five
    

    ③过滤并打印出相关行

     #在/etc/passwd文件中过滤出含有root的行,并打印出来
    [root@localhost ~] # sed -n '/root/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    
    #从/etc/passwd文件中打印以‘r’开头的行
    [root@localhost ~] # sed -n '/^r'/p  /etc/passwd 
    root:x:0:0:root:/root:/bin/bash
    rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
    rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
    rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
    radvd:x:75:75:radvd user:/:/sbin/nologin
    
    #从/etc/passwd文件中打印以‘bash’结尾的行
    [root@localhost ~] # sed -n '/bash$'/p  /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    muhonghuan:x:1000:1000:muhonghuan:/home/muhonghuan:/bin/bash
    
    #打印文件里包含ftp或root的行
    [root@localhost ~] # sed -n '/ftp\|root/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    
    #从第二行开始打印到包含ftp的行
    [root@localhost ~] # sed -n '2,/ftp/p' /etc/passwd
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    
    #-r表示支持正则表达式
    [root@localhost ~] # sed -nr '/ro{1,}t/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    

    3.删除行

    ①删除指定行

    [root@localhost ~] # cat shuzi.txt #查看文件
    one
    two
    three
    four
    five
    
    #全删后输出,不影响原文件,因为没有重定向
    [root@localhost ~] # sed 'd' shuzi.txt 
    
    #删除第3行
    [root@localhost ~] # sed '3d' shuzi.txt 
    one
    two
    four
    five
    
    #删除2到4行
    [root@localhost ~] # sed '2,4d' shuzi.txt 
    one
    five
    
    #删除最后一行
    [root@localhost ~] # sed '$d' shuzi.txt 
    one
    two
    three
    four
    

    ②过滤删除指定行

    [root@localhost ~] # cat shuzi.txt 
    one
    
    two
    three
    
    
    four
    five
    
    #删除空行
    [root@localhost ~] # sed '/^$/d' shuzi.txt 
    one
    two
    three
    four
    five
    
    [root@localhost ~] # cat shuzi.txt 
    one
    two
    three
    four
    five
    
    #删除以e结尾的行
    [root@localhost ~] # sed '/e$/d' shuzi.txt 
    two
    four
    #删除不以e结尾的行
    [root@localhost ~] # sed '/e$/!d' shuzi.txt 
    one
    three
    five
    

    ③下面这个慎用

    即从第一个位置打开行删除功能,到第二个位置关闭行删除功能,按行删除

    [root@localhost ~] # cat shuzi.txt 
    one
    two
    three
    four
    five
    #从e开始删除,到h结束,但是后面字符里含有e还会开始删除,直到有h结束
    [root@localhost ~] # sed '/e/,/h/d' shuzi.txt 
    four
    

    4.替换

    • 格式
    行范围  s/旧字符串/新字符串/替换标记
    
    • 4种替换标记
      数字:表明新字符串将替换第几处匹配的地方
      g:表明新字符串将会替换所有匹配的地方
      p:打印与替换命令匹配的行,与-n 一起使用
      w 文件:将替换的结果写到文件中
    #将第一行的第一个root替换为admin并打印出来
    [root@localhost ~] # sed -n 's/root/admin/p' /etc/passwd     
    admin:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/admin:/sbin/nologin
    
    #将第一行的第二个root替换为admin
    [root@localhost ~] # sed -n 's/root/admin/2p' /etc/passwd   
    root:x:0:0:admin:/root:/bin/bash
    
    #替换所有的root
    [root@localhost ~] # sed -n 's/root/admin/gp' /etc/passwd 
    admin:x:0:0:admin:/admin:/bin/bash
    operator:x:11:0:operator:/admin:/sbin/nologin
    
    #删除所有的root
    [root@localhost ~] # sed -n 's/root//gp' /etc/passwd  
    :x:0:0::/:/bin/bash
    operator:x:11:0:operator:/:/sbin/nologin
    
    #将1-5行的开头添加#号
    [root@localhost ~] # sed '1,5 s/^/#/' /etc/passwd 
    #root:x:0:0:root:/root:/bin/bash
    #bin:x:1:1:bin:/bin:/sbin/nologin
    #daemon:x:2:2:daemon:/sbin:/sbin/nologin
    #adm:x:3:4:adm:/var/adm:/sbin/nologin
    #lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    
    #把以root开头的行结尾的$替换为#
    [root@localhost ~] # sed -n '/^root/ s/$/#/p' /etc/passwd 
    root:x:0:0:root:/root:/bin/bash#
    
    #创建一个用于sed命令的脚本
    [root@localhost ~] # vim script.sed 
    s/1/22/                                #将1替换为22,下面以此类推
    s/5/66/
    #然后直接使用该脚本对文件进行操作                        
    [root@localhost ~] # sed -f script.sed  file    
    
    #将/etc/passwd中的1-20行输出保存到file.txt文件中
    [root@localhost ~] # sed '1,20w file.txt' /etc/passwd  
    
    #将/etc/passwd 中的1-20行的开头添加#后保存到out.txt文件中
    [root@localhost ~] # sed '1,20 s/^/#/w out.txt' /etc/passwd      
    
    #将/bin/bash替换成/bin/csh,这里在“/”前面加了转义符“\”是防止“/”具有其他的功能,转义符使其只有普通字符的功能
    [root@localhost ~] # sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd #转义符看着很乱,可以使用“!”或者“#”作为字符串的分隔符,作用同上    
    [root@localhost ~] # sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd     
    

    补充:利用sed工具查询以及提取IP地址

    [root@localhost ~]#/sbin/ifconfig ens33
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.2.3  netmask 255.255.255.0  broadcast 192.168.2.255
            inet6 fe80::f411:5214:9150:9903  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:46:34:bb  txqueuelen 1000  (Ethernet)
            RX packets 4485  bytes 435517 (425.3 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1300  bytes 149354 (145.8 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    [root@localhost ~]#/sbin/ifconfig ens33 | grep 'inet '
            inet 192.168.2.3  netmask 255.255.255.0  broadcast 192.168.2.255
    
    #sed 's/^.*inet //g'用来删除前面的inet部分,即用空字符将其全部替换替换;sed 's/ *netmask.*$//g'   用来删除后面netmask部分,原理同上
    [root@localhost ~]#/sbin/ifconfig ens33 | grep 'inet ' | sed 's/^.*inet //g' | sed 's/ *netmask.*$//g'   
    192.168.2.3
    
    
    展开全文
  • SED 脚本语法

    千次阅读 2009-08-04 19:30:00
    SED单行脚本快速参考 -------------------------------------------------------------------------SED单行脚本快速参考(Unix 流编辑器) 英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor)原标题...

    SED单行脚本快速参考 

    -------------------------------------------------------------------------
    SED单行脚本快速参考(Unix 流编辑器) 
    英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor)
    原标题:HANDY ONE-LINERS FOR SED (Unix stream editor)
    
    
    文本间隔:
    --------
    
     # 在每一行后面增加一空行
     sed G
    
     # 将原来的所有空行删除并在每一行后面增加一空行。
     # 这样在输出的文本中每一行后面将有且只有一空行。
     sed '/^$/d;G'
    
     # 在每一行后面增加两行空行
     sed 'G;G'
    
     # 将第一个脚本所产生的所有空行删除(即删除所有偶数行)
     sed 'n;d'
    
     # 在匹配式样“regex”的行之前插入一空行
     sed '/regex/{x;p;x;}'
    
     # 在匹配式样“regex”的行之后插入一空行
     sed '/regex/G'
    
     # 在匹配式样“regex”的行之前和之后各插入一空行
     sed '/regex/{x;p;x;G;}'
    
    编号:
    --------
    
     # 为文件中的每一行进行编号(简单的左对齐方式)。这里使用了“制表符”
     # (tab,见本文末尾关于'/t'的用法的描述)而不是空格来对齐边缘。
     sed = filename | sed 'N;s//n//t/'
    
     # 对文件中的所有行编号(行号在左,文字右端对齐)。
     sed = filename | sed 'N; s/^/     /; s/ */(./{6,/}/)/n//1  /'
    
     # 对文件中的所有行编号,但只显示非空白行的行号。
     sed '/./=' filename | sed '/./N; s//n/ /'
    
     # 计算行数 (模拟 "wc -l")
     sed -n '$='
    
    文本转换和替代:
    --------
    
     # Unix环境:转换DOS的新行符(CR/LF)为Unix格式。
     sed 's/.$//'                     # 假设所有行以CR/LF结束
     sed 's/^M$//'                    # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V
     sed 's//x0D$//'                  # ssed、gsed 3.02.80,及更高版本
    
     # Unix环境:转换Unix的新行符(LF)为DOS格式。
     sed "s/$/`echo -e ///r`/"        # 在ksh下所使用的命令
     sed 's/$'"/`echo ///r`/"         # 在bash下所使用的命令
     sed "s/$/`echo ///r`/"           # 在zsh下所使用的命令
     sed 's/$//r/'                    # gsed 3.02.80 及更高版本
    
     # DOS环境:转换Unix新行符(LF)为DOS格式。
     sed "s/$//"                      # 方法 1
     sed -n p                         # 方法 2
    
     # DOS环境:转换DOS新行符(CR/LF)为Unix格式。
     # 下面的脚本只对UnxUtils sed 4.0.7 及更高版本有效。要识别UnxUtils版本的
     #  sed可以通过其特有的“--text”选项。你可以使用帮助选项(“--help”)看
     # 其中有无一个“--text”项以此来判断所使用的是否是UnxUtils版本。其它DOS
     # 版本的的sed则无法进行这一转换。但可以用“tr”来实现这一转换。
     sed "s//r//" infile >outfile     # UnxUtils sed v4.0.7 或更高版本
     tr -d /r <infile >outfile        # GNU tr 1.22 或更高版本
    
     # 将每一行前导的“空白字符”(空格,制表符)删除
     # 使之左对齐
     sed 's/^[ /t]*//'                # 见本文末尾关于'/t'用法的描述
    
     # 将每一行拖尾的“空白字符”(空格,制表符)删除
     sed 's/[ /t]*$//'                # 见本文末尾关于'/t'用法的描述
    
     # 将每一行中的前导和拖尾的空白字符删除
     sed 's/^[ /t]*//;s/[ /t]*$//'
    
     # 在每一行开头处插入5个空格(使全文向右移动5个字符的位置)
     sed 's/^/     /'
    
     # 以79个字符为宽度,将所有文本右对齐
     sed -e :a -e 's/^./{1,78/}$/ &/;ta'  # 78个字符外加最后的一个空格
    
     # 以79个字符为宽度,使所有文本居中。在方法1中,为了让文本居中每一行的前
     # 头和后头都填充了空格。 在方法2中,在居中文本的过程中只在文本的前面填充
     # 空格,并且最终这些空格将有一半会被删除。此外每一行的后头并未填充空格。
     sed  -e :a -e 's/^./{1,77/}$/ & /;ta'                     # 方法1
     sed  -e :a -e 's/^./{1,77/}$/ &/;ta' -e 's//( */)/1//1/'  # 方法2
    
     # 在每一行中查找字串“foo”,并将找到的“foo”替换为“bar”
     sed 's/foo/bar/'                 # 只替换每一行中的第一个“foo”字串
     sed 's/foo/bar/4'                # 只替换每一行中的第四个“foo”字串
     sed 's/foo/bar/g'                # 将每一行中的所有“foo”都换成“bar”
     sed 's//(.*/)foo/(.*foo/)//1bar/2/' # 替换倒数第二个“foo”
     sed 's//(.*/)foo//1bar/'            # 替换最后一个“foo”
    
     # 只在行中出现字串“baz”的情况下将“foo”替换成“bar”
     sed '/baz/s/foo/bar/g'
    
     # 将“foo”替换成“bar”,并且只在行中未出现字串“baz”的情况下替换
     sed '/baz/!s/foo/bar/g'
    
     # 不管是“scarlet”“ruby”还是“puce”,一律换成“red”
     sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'  #对多数的sed都有效
     gsed 's/scarlet/|ruby/|puce/red/g'               # 只对GNU sed有效
    
     # 倒置所有行,第一行成为最后一行,依次类推(模拟“tac”)。
     # 由于某些原因,使用下面命令时HHsed v1.5会将文件中的空行删除
     sed '1!G;h;$!d'               # 方法1
     sed -n '1!G;h;$p'             # 方法2
    
     # 将行中的字符逆序排列,第一个字成为最后一字,……(模拟“rev”)
     sed '//n/!G;s//(./)/(.*/n/)/&/2/1/;//D;s/.//'
    
     # 将每两行连接成一行(类似“paste”)
     sed '$!N;s//n/ /'
    
     # 如果当前行以反斜杠“/”结束,则将下一行并到当前行末尾
     # 并去掉原来行尾的反斜杠
     sed -e :a -e '///$/N; sn//; ta'
    
     # 如果当前行以等号开头,将当前行并到上一行末尾
     # 并以单个空格代替原来行头的“=”
     sed -e :a -e '$!N;s//n=/ /;ta' -e 'P;D'
    
     # 为数字字串增加逗号分隔符号,将“1234567”改为“1,234,567”
     gsed ':a;s//B[0-9]/{3/}/>/,&/;ta'                     # GNU sed
     sed -e :a -e 's//(.*[0-9]/)/([0-9]/{3/}/)//1,/2/;ta'  # 其他sed
    
     # 为带有小数点和负号的数值增加逗号分隔符(GNU sed)
     gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})//1/2,/3/g;ta'
    
     # 在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)
     gsed '0~5G'                      # 只对GNU sed有效
     sed 'n;n;n;n;G;'                 # 其他sed
    
    选择性地显示特定行:
    --------
    
     # 显示文件中的前10行 (模拟“head”的行为)
     sed 10q
    
     # 显示文件中的第一行 (模拟“head -1”命令)
     sed q
    
     # 显示文件中的最后10行 (模拟“tail”)
     sed -e :a -e '$q;N;11,$D;ba'
    
     # 显示文件中的最后2行(模拟“tail -2”命令)
     sed '$!N;$!D'
    
     # 显示文件中的最后一行(模拟“tail -1”)
     sed '$!d'                        # 方法1
     sed -n '$p'                      # 方法2
    
     # 显示文件中的倒数第二行
     sed -e '$!{h;d;}' -e x              # 当文件中只有一行时,输入空行
     sed -e '1{$q;}' -e '$!{h;d;}' -e x  # 当文件中只有一行时,显示该行
     sed -e '1{$d;}' -e '$!{h;d;}' -e x  # 当文件中只有一行时,不输出
    
     # 只显示匹配正则表达式的行(模拟“grep”)
     sed -n '/regexp/p'               # 方法1
     sed '/regexp/!d'                 # 方法2
    
     # 只显示“不”匹配正则表达式的行(模拟“grep -v”)
     sed -n '/regexp/!p'              # 方法1,与前面的命令相对应
     sed '/regexp/d'                  # 方法2,类似的语法
    
     # 查找“regexp”并将匹配行的上一行显示出来,但并不显示匹配行
     sed -n '/regexp/{g;1!p;};h'
    
     # 查找“regexp”并将匹配行的下一行显示出来,但并不显示匹配行
     sed -n '/regexp/{n;p;}'
    
     # 显示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所
     # 在行的行号 (类似“grep -A1 -B1”)
     sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
    
     # 显示包含“AAA”、“BBB”或“CCC”的行(任意次序)
     sed '/AAA/!d; /BBB/!d; /CCC/!d'  # 字串的次序不影响结果
    
     # 显示包含“AAA”、“BBB”和“CCC”的行(固定次序)
     sed '/AAA.*BBB.*CCC/!d'
    
     # 显示包含“AAA”“BBB”或“CCC”的行 (模拟“egrep”)
     sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d    # 多数sed
     gsed '/AAA/|BBB/|CCC/!d'                        # 对GNU sed有效
    
     # 显示包含“AAA”的段落 (段落间以空行分隔)
     # HHsed v1.5 必须在“x;”后加入“G;”,接下来的3个脚本都是这样
     sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
    
     # 显示包含“AAA”“BBB”和“CCC”三个字串的段落 (任意次序)
     sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
    
     # 显示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任意次序)
     sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
     gsed '/./{H;$!d;};x;/AAA/|BBB/|CCC/b;d'         # 只对GNU sed有效
    
     # 显示包含65个或以上字符的行
     sed -n '/^./{65/}/p'
    
     # 显示包含65个以下字符的行
     sed -n '/^./{65/}/!p'            # 方法1,与上面的脚本相对应
     sed '/^./{65/}/d'                # 方法2,更简便一点的方法
    
     # 显示部分文本——从包含正则表达式的行开始到最后一行结束
     sed -n '/regexp/,$p'
    
     # 显示部分文本——指定行号范围(从第8至第12行,含8和12行)
     sed -n '8,12p'                   # 方法1
     sed '8,12!d'                     # 方法2
    
     # 显示第52行
     sed -n '52p'                     # 方法1
     sed '52!d'                       # 方法2
     sed '52q;d'                      # 方法3, 处理大文件时更有效率
    
     # 从第3行开始,每7行显示一次    
     gsed -n '3~7p'                   # 只对GNU sed有效
     sed -n '3,${p;n;n;n;n;n;n;}'     # 其他sed
    
     # 显示两个正则表达式之间的文本(包含)
     sed -n '/Iowa/,/Montana/p'       # 区分大小写方式
    
    选择性地删除特定行:
    --------
    
     # 显示通篇文档,除了两个正则表达式之间的内容
     sed '/Iowa/,/Montana/d'
    
     # 删除文件中相邻的重复行(模拟“uniq”)
     # 只保留重复行中的第一行,其他行删除
     sed '$!N; /^/(.*/)/n/1$/!P; D'
    
     # 删除文件中的重复行,不管有无相邻。注意hold space所能支持的缓存
     # 大小,或者使用GNU sed。
     sed -n 'G; s//n/&&/; /^/([ -~]*/n/).*/n/1/d; s//n//; h; P'
    
     # 删除除重复行外的所有行(模拟“uniq -d”)
     sed '$!N; s/^/(.*/)/n/1$//1/; t; D'
    
     # 删除文件中开头的10行
     sed '1,10d'
    
     # 删除文件中的最后一行
     sed '$d'
    
     # 删除文件中的最后两行
     sed 'N;$!P;$!D;$d'
    
     # 删除文件中的最后10行
     sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # 方法1
     sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # 方法2
    
     # 删除8的倍数行
     gsed '0~8d'                           # 只对GNU sed有效
     sed 'n;n;n;n;n;n;n;d;'                # 其他sed
    
     # 删除匹配式样的行
     sed '/pattern/d'                      # 删除含pattern的行。当然pattern
                                           # 可以换成任何有效的正则表达式
    
     # 删除文件中的所有空行(与“grep '.' ”效果相同)
     sed '/^$/d'                           # 方法1
     sed '/./!d'                           # 方法2
    
     # 只保留多个相邻空行的第一行。并且删除文件顶部和尾部的空行。
     # (模拟“cat -s”)
     sed '/./,/^$/!d'        #方法1,删除文件顶部的空行,允许尾部保留一空行
     sed '/^$/N;//n$/D'      #方法2,允许顶部保留一空行,尾部不留空行
    
     # 只保留多个相邻空行的前两行。
     sed '/^$/N;//n$/N;//D'
    
     # 删除文件顶部的所有空行
     sed '/./,$!d'
    
     # 删除文件尾部的所有空行
     sed -e :a -e '/^/n*$/{$d;N;ba' -e '}'  # 对所有sed有效
     sed -e :a -e '/^/n*$/N;//n$/ba'        # 同上,但只对 gsed 3.02.*有效
    
     # 删除每个段落的最后一行
     sed -n '/^$/{p;h;};/./{x;/./p;}'
    
    特殊应用:
    --------
    
     # 移除手册页(man page)中的nroff标记。在Unix System V或bash shell下使
     # 用'echo'命令时可能需要加上 -e 选项。
     sed "s/.`echo ///b`//g"    # 外层的双括号是必须的(Unix环境)
     sed 's/.^H//g'             # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H
     sed 's/./x08//g'           # sed 1.5,GNU sed,ssed所使用的十六进制的表示方法
    
     # 提取新闻组或 e-mail 的邮件头
     sed '/^$/q'                # 删除第一行空行后的所有内容
    
     # 提取新闻组或 e-mail 的正文部分
     sed '1,/^$/d'              # 删除第一行空行之前的所有内容
    
     # 从邮件头提取“Subject”(标题栏字段),并移除开头的“Subject:”字样
     sed '/^Subject: */!d; s///;q'
    
     # 从邮件头获得回复地址
     sed '/^Reply-To:/q; /^From:/h; /./d;g;q'
    
     # 获取邮件地址。在上一个脚本所产生的那一行邮件头的基础上进一步的将非电邮
     # 地址的部分剃除。(见上一脚本)
     sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'
    
     # 在每一行开头加上一个尖括号和空格(引用信息)
     sed 's/^/> /'
    
     # 将每一行开头处的尖括号和空格删除(解除引用)
     sed 's/^> //'
    
     # 移除大部分的HTML标签(包括跨行标签)
     sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
    
     # 将分成多卷的uuencode文件解码。移除文件头信息,只保留uuencode编码部分。
     # 文件必须以特定顺序传给sed。下面第一种版本的脚本可以直接在命令行下输入;
     # 第二种版本则可以放入一个带执行权限的shell脚本中。(由Rahul Dhesi的一
     # 个脚本修改而来。)
     sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode   # vers. 1
     sed '/^end/,/^begin/d' "$@" | uudecode                    # vers. 2
    
     # 将文件中的段落以字母顺序排序。段落间以(一行或多行)空行分隔。GNU sed使用
     # 字元“/v”来表示垂直制表符,这里用它来作为换行符的占位符——当然你也可以
     # 用其他未在文件中使用的字符来代替它。
     sed '/./{H;d;};x;s//n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=//n/g'
     gsed '/./{H;d};x;y//n//v/' file | sort | sed '1s//v//;y//v//n/'
    
     # 分别压缩每个.TXT文件,压缩后删除原来的文件并将压缩后的.ZIP文件
     # 命名为与原来相同的名字(只是扩展名不同)。(DOS环境:“dir /b”
     # 显示不带路径的文件名)。
     echo @echo off >zipup.bat
     dir /b *.txt | sed "s/^/(.*/)/.TXT/pkzip -mo /1 /1.TXT/" >>zipup.bat
    
    
    使用SED:Sed接受一个或多个编辑命令,并且每读入一行后就依次应用这些命令。
    当读入第一行输入后,sed对其应用所有的命令,然后将结果输出。接着再读入第二
    行输入,对其应用所有的命令……并重复这个过程。上一个例子中sed由标准输入设
    备(即命令解释器,通常是以管道输入的形式)获得输入。在命令行给出一个或多
    个文件名作为参数时,这些文件取代标准输入设备成为sed的输入。sed的输出将被
    送到标准输出(显示器)。因此:
    
     cat filename | sed '10q'         # 使用管道输入
     sed '10q' filename               # 同样效果,但不使用管道输入
     sed '10q' filename > newfile     # 将输出转移(重定向)到磁盘上
    
    要了解sed命令的使用说明,包括如何通过脚本文件(而非从命令行)来使用这些命
    令,请参阅《sed & awk》第二版,作者Dale Dougherty和Arnold Robbins
    (O'Reilly,1997;http://www.ora.com),《UNIX Text Processing》,作者
    Dale Dougherty和Tim O'Reilly(Hayden Books,1987)或者是Mike Arst写的教
    程——压缩包的名称是“U-SEDIT2.ZIP”(在许多站点上都找得到)。要发掘sed
    的潜力,则必须对“正则表达式”有足够的理解。正则表达式的资料可以看
    《Mastering Regular Expressions》作者Jeffrey Friedl(O'reilly 1997)。
    Unix系统所提供的手册页(“man”)也会有所帮助(试一下这些命令
    “man sed”、“man regexp”,或者看“man ed”中关于正则表达式的部分),但
    手册提供的信息比较“抽象”——这也是它一直为人所诟病的。不过,它本来就不
    是用来教初学者如何使用sed或正则表达式的教材,而只是为那些熟悉这些工具的人
    提供的一些文本参考。
    
    括号语法:前面的例子对sed命令基本上都使用单引号('...')而非双引号
    ("...")这是因为sed通常是在Unix平台上使用。单引号下,Unix的shell(命令
    解释器)不会对美元符($)和后引号(`...`)进行解释和执行。而在双引号下
    美元符会被展开为变量或参数的值,后引号中的命令被执行并以输出的结果代替
    后引号中的内容。而在“csh”及其衍生的shell中使用感叹号(!)时需要在其前
    面加上转义用的反斜杠(就像这样:/!)以保证上面所使用的例子能正常运行
    (包括使用单引号的情况下)。DOS版本的Sed则一律使用双引号("...")而不是
    引号来圈起命令。
    
    '/t'的用法:为了使本文保持行文简洁,我们在脚本中使用'/t'来表示一个制表
    符。但是现在大部分版本的sed还不能识别'/t'的简写方式,因此当在命令行中为
    脚本输入制表符时,你应该直接按TAB键来输入制表符而不是输入'/t'。下列的工
    具软件都支持'/t'做为一个正则表达式的字元来表示制表符:awk、perl、HHsed、
    sedmod以及GNU sed v3.02.80。
    
    不同版本的SED:不同的版本间的sed会有些不同之处,可以想象它们之间在语法上
    会有差异。具体而言,它们中大部分不支持在编辑命令中间使用标签(:name)或分
    支命令(b,t),除非是放在那些的末尾。这篇文档中我们尽量选用了可移植性较高
    的语法,以使大多数版本的sed的用户都能使用这些脚本。不过GNU版本的sed允许使
    用更简洁的语法。想像一下当读者看到一个很长的命令时的心情:
    
       sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
    
    好消息是GNU sed能让命令更紧凑:
    
       sed '/AAA/b;/BBB/b;/CCC/b;d'      # 甚至可以写成
       sed '/AAA/|BBB/|CCC/b;d'
    
    此外,请注意虽然许多版本的sed接受象“/one/ s/RE1/RE2/”这种在's'前带有空
    格的命令,但这些版本中有些却不接受这样的命令:“/one/! s/RE1/RE2/”。这时
    只需要把中间的空格去掉就行了。
    
    速度优化:当由于某种原因(比如输入文件较大、处理器或硬盘较慢等)需要提高
    命令执行速度时,可以考虑在替换命令(“s/.../.../”)前面加上地址表达式来
    提高速度。举例来说:
    
       sed 's/foo/bar/g' filename         # 标准替换命令
       sed '/foo/ s/foo/bar/g' filename   # 速度更快
       sed '/foo/ s//bar/g' filename      # 简写形式
    
    当只需要显示文件的前面的部分或需要删除后面的内容时,可以在脚本中使用“q”
    命令(退出命令)。在处理大的文件时,这会节省大量时间。因此:
    
       sed -n '45,50p' filename           # 显示第45到50行
       sed -n '51q;45,50p' filename       # 一样,但快得多
    
    如果你有其他的单行脚本想与大家分享或者你发现了本文档中错误的地方,请发电
    子邮件给本文档的作者(Eric Pement)。邮件中请记得提供你所使用的sed版本、 
    该sed所运行的操作系统及对问题的适当描述。本文所指的单行脚本指命令行的长
    度在65个字符或65个以下的sed脚本〔译注1〕。本文档的各种脚本是由以下所列作
    者所写或提供:
    
     Al Aab                               # 建立了“seders”邮件列表
     Edgar Allen                          # 许多方面
     Yiorgos Adamopoulos                  # 许多方面
     Dale Dougherty                       # 《sed & awk》作者
     Carlos Duarte                        # 《do it with sed》作者
     Eric Pement                          # 本文档的作者
     Ken Pizzini                          # GNU sed v3.02 的作者
     S.G. Ravenhall                       # 去html标签脚本
     Greg Ubben                           # 有诸多贡献并提供了许多帮助
    -------------------------------------------------------------------------
    
    译注1:大部分情况下,sed脚本无论多长都能写成单行的形式(通过`-e'选项和`;'
    号)——只要命令解释器支持,所以这里说的单行脚本除了能写成一行还对长度有
    所限制。因为这些单行脚本的意义不在于它们是以单行的形式出现。而是让用户能
    方便地在命令行中使用这些紧凑的脚本才是其意义所在。

    展开全文
  • shell 脚本 sed编辑

    2021-03-13 13:47:12
    这里写目录标题sed编辑器概念sed的工作流程三级目录使用地址删除插入 sed编辑器 概念 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。 se’d编辑器可以根据命令来处理数据...
  • SED单行脚本快速参考 -----------------------------------------...SED单行脚本快速参考(Unix 流编辑器) 英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) 原标题:HANDY ONE-LINERS F...
  • SED脚本快速参考

    2018-05-20 21:51:00
    SED脚本快速参考 英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor)原标题:HANDY ONE-LINERS FOR SED (Unix stream editor)整理:Eric Pement - 电邮:pemente[at]northpark[dot]edu 版本5.5译者:...
  • shell sed脚本速查

    2019-11-15 09:15:06
    删除 #删除首行前10个字符 sed -i 's/^.\\{10\\}//' test1.txt.bak1 # 在每一行后面增加一空行 ...# 将第一个脚本所产生的所有空行删除(即删除所有偶数行) sed 'n;d' # 将每一行前导的“空白字符”...
  • shell脚本编辑 sed

    2020-03-18 10:28:11
    shell脚本编辑 sed 语法结构: 1. sed ‘s/o1d/new/’ test. txt //替换第一个匹配到的old 2.sed 's/o1d/new/g’ test. txt //替换所有匹配到的old 3.sed ‘s/old/new/2’ test . txt //替换每行匹配到的第2个 替换...
  • shell脚本 sed编辑

    2020-03-29 12:49:38
    sed:流编辑sed -n '/pattern/command' file -n 显示pattern查找出的匹配行(不加-n会显示原来的行与匹配的行) -e 直接在命令行进行sed编辑 sed -n -e '/aaaaa/p' -e '/AAAA/p' file (p是打印的意思) -f ...
  • Shell脚本Sed编辑

    2021-03-22 08:47:34
    Shell脚本Sed编辑Sed编辑器工作流程命令格式常用选项常用操作打印内容使用地址进行修改删除行替换4种替换标记插入 Sed编辑sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑...
  • 我需要使用bash脚本从巨大的文本文件中反复删除第一行。 现在,我正在使用sed -i -e "1d" $FILE但删除它大约需要一分钟。 有没有更有效的方法来实现这一目标?
  • Shell脚本sed编辑

    2021-03-24 15:31:06
    sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件sed的工作流程 读取: sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式...
  • shell脚本sed编辑

    2021-03-15 10:41:42
    sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 sed的工作流程 主要包括读取、执行和显示三个过程: 读取:sed从输入流(文件、管道、标准输入)中读取一...
  • 英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor) ...在以下地址可找到本文档的最新(英文)版本: http://sed.sourceforge.net/sed1line.txt http://www.pement.org/sed/sed1line.tx
  • shell脚本--sed的用法

    万次阅读 多人点赞 2018-05-17 01:04:27
    sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件编辑。本文主要介绍sed的一些基本用法,并通过...
  • sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。 二、sed的工作流程 sed 的工作流程主要包括读取、执行和显示三个过程: 读取:sed 从输入流(文件、管道...
  • 语法:sed [-hnV][-e[removed]][-f[removed]][文本文件]补充说明:sed可依照script的指令,来处理、编辑文本文件。参数:-e[removed]或–expression=[removed] 以选项中指定的script来处理输入的文本文件。-f...
  • sed 可依照脚本的指令来处理、编辑文本文件sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 语法格式:sed [参数] 常用参数: -e或–expression= 以选项中指定的script来处理输入...
  • sed写入文件 写入文件要用w指定,比如把第二行到第四行的内容写到文件test中,输入: sed '2,4w test' value 查看test中的内容为: This is line 2 This is line 3 This is line 4 再举例输入: sed -n '/line 3/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,616
精华内容 14,246
关键字:

sed脚本文件编辑