sed_塞尔达 - CSDN
sed 订阅
SED是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大。 展开全文
SED是一项Linux指令,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些,awk的功能复杂,对列处理的功能比较强大。
信息
D
删除模板块的第一行
外文名
SED
options
'command' file(s)
c    \
用新的文本改变本行的文本。
中文名
SED
SEDsed命令
sed全称是:Stream EDitor调用sed命令有两种形式:sed [options] 'command' file(s)sed [options] -f scriptfile file(s)a\在当前行后面加入一行文本。b label分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。c\用新的文本改变本行的文本。d从模板块(Pattern space)位置删除行。D删除模板块的第一行。i\在当前行上面插入文本。h拷贝模板块的内容到内存中的缓冲区。H追加模板块的内容到内存中的缓冲区g获得内存缓冲区的内容,并替代当前模板块中的文本。G获得内存缓冲区的内容,并追加到当前模板块文本的后面。l列表不能打印字符的清单。n读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。p打印模板块的行。P(大写)打印模板块的第一行。q退出Sed。r file从file中读行。t labelif分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。T label错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。w file写并追加模板块到file末尾。W file写并追加模板块的第一行到file末尾。!表示后面的命令对所有没有被选定的行发生作用。s/re/string用string替换正则表达式re。=打印当前行号码。#把注释扩展到下一个换行符以前。以下的是替换标记g表示行内全面替换。p表示打印行。w表示把行写入一个文件。x表示互换模板块中的文本和缓冲区中的文本。y表示把一个字符翻译为另外的字符(但是不用于正则表达式)
收起全文
精华内容
参与话题
  • Sed 命令详解 & 正则表达式

    千次阅读 2018-03-16 08:23:42
    1.简介sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前...
    1.简介
    sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
    sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
     
    2.定址
    定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
     
    地址是一个数字,则表示行号;是“$"符号,则表示最后一行。例如: 

    sed -'3p' datafile
    只打印第三行

      只显示指定行范围的文件内容,例如:

    # 只查看文件的第100行到第200行
    sed -n '100,200p' mysql_slow_query.log

     地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。例如:

    sed '2,5d' datafile
    #删除第二到第五行
    sed '/My/,/You/d' datafile
    #删除包含"My"行到包含"You"行之间的行
    sed '/My/,10d' datafile
    #删除包含"My"行到第十行的内容

     3.命令与选项

    sed命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址则处理所有的输入行。

     3.1 sed命令

     命令 功能
     a\

     在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行

     c\ 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
     i\ 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
     d 删除行
     h 把模式空间里的内容复制到暂存缓冲区
     H 把模式空间里的内容追加到暂存缓冲区
     g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
     G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
     l 列出非打印字符
     p 打印行
     n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
     q 结束或退出sed
     r 从文件中读取输入行
     ! 对所选行以外的所有行应用命令
     s 用一个字符串替换另一个
     g 在行内进行全局替换
      
     w 将所选的行写入文件
     x 交换暂存缓冲区与模式空间的内容
     y 将字符替换为另一字符(不能对正则表达式使用y命令)

     3.2 sed选项

     选项 功能
     -e 进行多项编辑,即对输入行应用多条sed命令时使用
     -n 取消默认的输出
     -f 指定sed脚本的文件名
     
     4.退出状态
    sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。
    5.正则表达式元字符
     与grep一样,sed也支持特殊元字符,来进行模式查找、替换。不同的是,sed使用的正则表达式是括在斜杠线"/"之间的模式。
    如果要把正则表达式分隔符"/"改为另一个字符,比如o,只要在这个字符前加一个反斜线,在字符后跟上正则表达式,再跟上这个字符即可。例如:sed -n '\o^Myop' datafile
     
     元字符 功能 示例
     ^ 行首定位符 /^my/  匹配所有以my开头的行
     $ 行尾定位符 /my$/  匹配所有以my结尾的行
     . 匹配除换行符以外的单个字符 /m..y/  匹配包含字母m,后跟两个任意字符,再跟字母y的行
     * 匹配零个或多个前导字符 /my*/  匹配包含字母m,后跟零个或多个y字母的行
     [] 匹配指定字符组内的任一字符 /[Mm]y/  匹配包含My或my的行
     [^] 匹配不在指定字符组内的任一字符 /[^Mm]y/  匹配包含y,但y之前的那个字符不是M或m的行
      保存已匹配的字符 1,20s/self/\1r/  标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。
     & 保存查找串以便在替换串中引用 s/my/**&**/  符号&代表查找串。my将被替换为**my**
     \< 词首定位符 /\<my/  匹配包含以my开头的单词的行
     \> 词尾定位符 /my\>/  匹配包含以my结尾的单词的行
     x\{m\} 连续m个x /9\{5\}/ 匹配包含连续5个9的行
     x\{m,\} 至少m个x /9\{5,\}/  匹配包含至少连续5个9的行
     x\{m,n\} 至少m个,但不超过n个x /9\{5,7\}/  匹配包含连续5到7个9的行
     
    6.范例
     
    6.1 p命令
    命令p用于显示模式空间的内容。默认情况下,sed把输入行打印在屏幕上,选项-n用于取消默认的打印操作。当选项-n和命令p同时出现时,sed可打印选定的内容。
     

    sed '/my/p' datafile
    #默认情况下,sed把所有输入行都打印在标准输出上。如果某行匹配模式my,p命令将把该行另外打印一遍。


    sed -'/my/p' datafile
    #选项-n取消sed默认的打印,p命令把匹配模式my的行打印一遍。

     6.2 d命令

    命令d用于删除输入行。sed先将输入行从文件复制到模式空间里,然后对该行执行sed命令,最后将模式空间里的内容显示在屏幕上。如果发出的是命令d,当前模式空间里的输入行会被删除,不被显示。

    sed '$d' datafile
    #删除最后一行,其余的都被显示

    sed '/my/d' datafile
    #删除包含my的行,其余的都被显示

     6.3 s命令

    sed 's/^My/You/g' datafile
    #命令末端的g表示在行内进行全局替换,也就是说如果某行出现多个My,所有的My都被替换为You。

    sed -'1,20s/My$/You/gp' datafile
    #取消默认输出,处理1到20行里匹配以My结尾的行,把行内所有的My替换为You,并打印到屏幕上。

      

    sed 's#My#Your#g' datafile
    #紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符、反斜线除外),只要紧跟s命令,就成了新的串分隔符。

     

    6.4 e选项

    -e是编辑命令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓冲区中的行上。

    sed -'1,10d' -'s/My/Your/g' datafile

    #选项-e用于进行多重编辑。第一重编辑删除第1-3行。第二重编辑将出现的所有My替换为Your。因为是逐行进行这两项编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。

     6.5 r命令

    r命令是读命令。sed使用该命令将一个文本文件中的内容加到当前文件的特定位置上。

    sed '/My/r introduce.txt' datafile
    #如果在文件datafile的某一行匹配到模式My,就在该行后读入文件introduce.txt的内容。如果出现My的行不止一行,则在出现My的各行后都读入introduce.txt文件的内容。

     
    6.6 w命令

    sed -'/hrwang/w me.txt' datafile

     6.7 a\ 命令

    a\ 命令是追加命令,追加将添加新文本到文件中当前行(即读入模式缓冲区中的行)的后面。所追加的文本行位于sed命令的下方另起一行。如果要追加的内容超过一行,则每一行都必须以反斜线结束,最后一行除外。最后一行将以引号和文件名结束。

    sed '/^hrwang/a\
    >hrwang and mjfan are husband\
    >and wife'
     datafile
    #如果在datafile文件中发现匹配以hrwang开头的行,则在该行下面追加hrwang and mjfan are husband and wife

     6.8 i\ 命令

    i\ 命令是在当前行的前面插入新的文本。

     6.9 c\ 命令

    sed使用该命令将已有文本修改成新的文本。

     6.10 n命令

    sed使用该命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何sed命令都将应用到匹配行紧接着的下一行上。

    sed '/hrwang/{n;s/My/Your/;}' datafile

    注:如果需要使用多条命令,或者需要在某个地址范围内嵌套地址,就必须用花括号将命令括起来,每行只写一条命令,或这用分号分割同一行中的多条命令。
     6.11 y命令
    该命令与UNIX/Linux中的tr命令类似,字符按照一对一的方式从左到右进行转换。例如,y/abc/ABC/将把所有小写的a转换成A,小写的b转换成B,小写的c转换成C。
     

    sed '1,20y/hrwang12/HRWANG^$/' datafile
    #将1到20行内,所有的小写hrwang转换成大写,将1转换成^,将2转换成$
    #正则表达式元字符对y命令不起作用。与s命令的分隔符一样,斜线可以被替换成其它的字符。

     6.12 q命令

    q命令将导致sed程序退出,不再进行其它的处理。

    sed '/hrwang/{s/hrwang/HRWANG/;q;}' datafile

     6.13 h命令和g命令

    #cat datafile

    My name is hrwang.

    Your name is mjfan.

    hrwang is mjfan's husband.

    mjfan is hrwang's wife.

      

    sed -'/hrwang/h' -'$G' datafile

    sed -e '/hrwang/H' -e '$G' datafile

    #通过上面两条命令,你会发现h会把原来暂存缓冲区的内容清除,只保存最近一次执行h时保存进去的模式空间的内容。而H命令则把每次匹配hrwnag的行都追加保存在暂存缓冲区。

    sed -e '/hrwang/H' -e '$g' datafile

    sed -e '/hrwang/H' -e '$G' datafile

    #通过上面两条命令,你会发现g把暂存缓冲区中的内容替换掉了模式空间中当前行的内容,此处即替换了最后一行。而G命令则把暂存缓冲区的内容追加到了模式空间的当前行后。此处即追加到了末尾。

     7. sed脚本

    sed脚本就是写在文件中的一列sed命令。脚本中,要求命令的末尾不能有任何多余的空格或文本。如果在一行中有多个命令,要用分号分隔。执行脚本时,sed先将输入文件中第一行复制到模式缓冲区,然后对其执行脚本中所有的命令。每一行处理完毕后,sed再复制文件中下一行到模式缓冲区,对其执行脚本中所有命令。使用sed脚本时,不再用引号来确保sed命令不被shell解释。例如sed脚本script:

    #handle datafile
    3i\
    ~~~~~~~~~~~~~~~~~~~~~
    3,$s/\(hrwang\) is
     \(mjfan\)/\2 is \1/
    $a\
    We will love eachother forever!!
     

     

     #sed -f script datafile
    My name is hrwang
    Your name is mjfan
    ~~~~~~~~~~~~~~~~~~~~~
    mjfan is hrwang's husband.          
    mjfan is hrwang'
    s wife.

    We will love eachother forever!!



    Linux正则表达式技术指南

    发表于2009-12-31 11:13次阅读| 来源 TechTarget中国1 条评论| 作者
    摘要:作为一个Linux管理员,您需要对文本文件进行处理。您可以使用不同的工具如grep、awk以及sed去查找包含特定文本串的文件。这里,我将介绍一种使用正则表达式,以灵活的方式,去搜索文件中的文本的方法。
            作为一个Linux管理员,您需要对文本文件进行处理。您可以使用不同的工具如grep、awk以及sed去查找包含特定文本串的文件。这里,我将介绍一种使用正则表达式,以灵活的方式,去搜索文件中的文本的方法。

      让我们考虑一个正则表达式发挥作用的例子。比如,当你尝试使用命令grep –r host /时,其返回的结果会很庞大。因为每一个包含host这个文本串的字(像ghostscript这样的字)都会匹配。采用正则表达式,你可以更好地定制你要查找什么。例如,你可以使用正则表达式'^host',告诉grep仅仅查找以host开始的行。

      正则表达式并不是在所有命令中都可用,您使用的命令必须已经事先编好程序,以便能够使用正则表达式。这些命令中最普遍使用的命令是grep、tr以及vi。其它的工具,像sed和awk,也可以使用正则表达式。

      使用正则表达式的一个例子为:

      grep 'lin.x' *

      正则表达式'lin.x'中的点有特殊的含义。它会匹配处于该位置的任意字符。为了防止解释性的问题,我建议您总是将正则表达式置于单引号间,这样就可以防止shell对正则表达式进行解释。

      使用正则表达式

      您可以使用正则表达式做很多事情。在以下的列表中,您可以找到一些最普通、最常用的正则表达式的例子。

        * ^:表示文本串必须在一行的开头。所以,当查找行的开头只为“hosts”的行,可以使用命令:grep -ls '^hosts'
        * $:代表了一行的结尾。所以,当查找行的结尾只为“hosts”的行,可以使用命令:grep -ls 'hosts$'
        *   你可以在一个正则表达式中结合^和$,去查找仅仅包含"yes"的行,使用的命令为grep -ls '^yes$'
        * .: 一个可以指代除了换行符以外任意字符的通配符。为了查找包含tex、tux、tox或者tix的行,可以使用:grep -ls 't.x'
        * [ ]:表示在一个正则表达式中,方括号之间的字符是可选的。为了查找名字为pinda或者linda的用户,可以使用命令:grep -ls '[pl]inda'
        * [^ ]:忽略掉方括号中^之后的所有字符。为了查找包含文本linda的行,并忽略掉其中仅包含linda或者pinda的行,命令为:grep -ls '[^pl]inda'
        * -:代表一类或者一个范围内的字符。在像tr这样的命令中,这是非常有用的。以下的命令可以将所有的小写字母转为大写字母:tr a-z A-Z < mytext。同样地,你可以使用正则表达式grep -ls '^0-9'去查找其中有一些行是以数字开头的文件。
        * \< 和 \>:查找一个字的开头或者结尾的模式。查找行的开头的字以"san"为起始的命令为: grep \<SAN< code>。这些正则表达式有两个缺点—他们并不查找以指定的正则表达式开头的行,并且他们并不被所有的工具所支持。但是,vi和grep是支持这种用法的。
        * \:确保在正则表达式中有特殊含义的字符不被解释。查找以任何字符开始,后面跟着文本"host"的文本串的命令为grep -ls '.host'。而如果你需要查找以点为第一个字符,紧接着为"host"的文本串,可以用命令:grep -ls '\.host'

      这些正则表达式可以帮助您找到包含特定文本串的字。您也可以使用正则表达式去指定,在一个字中,该字符串出现的频率。比如,您可以使用正则表达式去搜索刚好包含用户名"linda"三次的文件。为了达到这一目的,您需要使用正则表达式的重复算子,并保证整个正则表达式位于引号中。没有引号的话,您可能会导致shell去解释您的重复算子。

      最重要的重复算子的列表如下:

        * *:表示前述的正则表达式可能出现一次、多次或者根本不出现。注意:不要和shell中的*混淆—在shell中,*表示任意字符,而在正则表达式中,*表示之前的正则表达式可能存在。
        * ?:表示在该位置可能是一个字符(但并不是必须是)。例如,同时查找color和colour的命令为:grep -ls 'colo.r'
        * +:表示之前的字符或者正则表达式至少要出现一次
        * \{n\}:表示之前的字符或者正则表达式至少要出现n次。当你查找一个介于100到999之间的数字时,这是很有用的:grep -ls '0-9\{3\}' 

      我们已经向您概述了正则表达式的使用方法。这可以让您在做一个管理员时,更加地有效率。正则表达式可以提供更多的功能,包括一些相当复杂的操作。但在之前,请首先掌握我们已经介绍的这些技能。正则表达式可以非常复杂,以至于你会很容易迷失其中。


    展开全文
  • sed命令详解

    2009-08-04 17:56:47
    1.sed -n '2'p filename 打印文件的第二行。 2.sed -n '1,3'p filename 打印文件的1到3行 3. sed -n '/Neave/'p filename 打印匹配Neave的行(模糊匹配) 4. sed -n '4,/The/'p filename 在第4行查询模式The 5...


    1.sed -n '2'p filename
    打印文件的第二行。
    2.sed -n '1,3'p filename
    打印文件的1到3行
    3. sed -n '/Neave/'p filename
    打印匹配Neave的行(模糊匹配)
    4. sed -n '4,/The/'p filename
    在第4行查询模式The
    5. sed -n '1,$'p filename
    打印整个文件,$表示最后一行。
    6. sed -n '/.*ing/'p filename
    匹配任意字母,并以ing结尾的单词(点号不能少)
    7 sed -n / -e '/music/'= filename
    打印匹配行的行号,-e 会打印文件的内容,同时在匹配行的前面标志行号。-n只打印出实际的行号。
    8.sed -n -e '/music/'p -e '/music/'= filename
    打印匹配的行和行号,行号在内容的下面
    9.sed '/company/' a\ "Then suddenly it happend" filename
    选择含有company的行,将后面的内容"Then suddenly it happend"加入下一行。注意:它并不改变文件,所有操作在缓冲区,如果要保存输出,重定向到一个文件。
    10. sed '/company/' i\ "Then suddenly it happend" filename
    同9,只是在匹配的行前插入
    11.sed '/company/' c\ "Then suddenly it happend" filename
    用"Then suddenly it happend"替换匹配company的行的内容。
    12.sed '1'd ( '1,3'd '$'d '/Neave/'d) filename
    删除第一行(1到3行,最后一行,匹配Neave的行)
    13.[ address [,address]] s/ pattern-to-find /replacement-pattern/[g p w n]
    s (switch)选项通知sed这是一个替换操作,并查询pattern-to-find,成功后用replacement-pattern替换它。
    替换选项如下:
    g (global)缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式。
    p (print) 缺省sed将所有被替换行写入标准输出,加p选项将使-n选项无效。-n选项不打印输出结果。
    w (write) 文件名使用此选项将输出定向到一个文件。(注意只将匹配替换的行写入文件,而不是整个内容)
    14.sed s'/nurse/"hello "&/' filename
    将'hello '增加到'nurse' 的前面。
    15. sed '/company/r append.txt' filename
    在匹配company的行的下一行开始加入文件append.txt的内容。
    16. sed '/company/'q filename
    首次匹配company后就退出sed程序

    之所以看 sed 命令,是因为我遇到了这个一个问题。
    网上有很多教程,他们发表了很多程序代码,但是作者为了解释方便,都对程序作了行号编码,就像下面这样:

    代码 ::

    1:#!/bin/bash
    2:#rename file extesions
    3:#
    4:# rfe old_extensions new_extension

    假设这个文件名是 tmp ,那么我们可以使用下面的命令来去掉这个行号和冒号 ( )

    代码 ::


    sed -e s'/^[0-9]\{1,\}://g' tmp

    不过上面的命令的命令有一个缺点,那就是如果这个行号不是数字开头,而是有空格的话,那就需要修改匹配规则,规则应该修改为匹配第一个非空白字符是数字开始,后面接一个冒号的配对。命令如下:

    代码 ::

    sed -e s'/^[^0-9a-zA-Z]*[0-9]\{1,\}://g' tmp

    这令我很兴奋,于是想看看 sed 到底有多厉害,看了以后,明白的是不是 sed 有多厉害,就像 awk 一样,他们只是把正则表达式用到了极致。

    Redhat6.0 为测试环境
    事实上在 solaris 下的 sed 命令要比 linux 强,但因为没有测试
    环境,我这里只给在 linux 下经过测试的用法。
    命令行参数简介
    首先假设我们有这样一个文本文件 sedtest.txt
    输出指定范围的行 p
    在每一行前面增加一个制表符 (^I)
    在每一行后面增加 --end
    显示指定模式匹配行的行号 [/pattern/]=
    在匹配行后面增加文本 [/pattern/]a\ 或者 [address]a\
    删除匹配行 [/pattern/]d 或者 [address1][,address2]d
    替换匹配行 [/pattern/]c\ 或者 [address1][,address2]c\
    在匹配行前面插入文本 [/pattern/]i\ 或者 [address]i\
    替换匹配串 ( 注意不再是匹配行 ) [addr1][,addr2]s/old/new/g
    限定范围后的模式匹配
    指定替换每一行中匹配的第几次出现
    & 代表最后匹配
    利用 sed 修改 PATH 环境变量
    测试并提高 sed 命令运行效率
    指定输出文件 [address1][,address2]w outputfile
    指定输入文件 [address]r inputfile
    替换相应字符 [address1][,address2]y/old/new/
    ! 号的使用
    \c 正则表达式 c 的使用
    sed 命令中正则表达式的复杂性
    转换 man 手册成普通文本格式 ( )
    sed man 手册 ( 用的就是上面的方法 )
    命令行参数简介

    sed
    -e script
    指定 sed 编辑命令
    -f scriptfile
    指定的文件中是 sed 编辑命令
    -n
    寂静模式,抑制来自 sed 命令执行过程中的冗余输出信息,比如只
    显示那些被改变的行。
    不明白?不要紧,把这些肮脏丢到一边,跟我往下走,不过下面的介绍里
    不包括正则表达式的解释,如果你不明白,可能有点麻烦。
    首先假设我们有这样一个文本文件 sedtest.txt
    cat > sedtest.txt
    Sed is a stream editor
    ----------------------
    A stream editor is used to perform basic text transformations on an input stream
    --------------------------------------------------------------------------------
    While in some ways similar to an editor which permits scripted edits (such as ed
    )
    ,
    --------------------------------------------------------------------------------
    -
    -
    sed works by making only one pass over the input(s), and is consequently more
    -----------------------------------------------------------------------------
    efficient. But it is sed's ability to filter text in a pipeline which particular
    l
    y
    --------------------------------------------------------------------------------
    -
    输出指定范围的行 p other types of editors.
    sed -e "1,4p" -n sedtest.txt
    sed -e "/form/p" -n sedtest.txt
    sed -e "1,/form/p" -n sedtest.txt
    在每一行前面增加一个制表符 (^I)
    sed "s/^/^I/g" sedtest.txt
    注意 ^I 的输入方法是 ctrl-v ctrl-i
    单个 ^ 表示行首
    在每一行后面增加 --end
    sed "s/$/--end/g" sedtest.txt
    单个 $ 表示行尾
    显示指定模式匹配行的行号 [/pattern/]=
    sed -e '/is/=' sedtest.txt
    1
    Sed is a stream editor
    ----------------------
    3
    A stream editor is used to perform basic text transformations on an input stream
    --------------------------------------------------------------------------------
    While in some ways similar to an editor which permits scripted edits (such as ed
    )
    ,
    --------------------------------------------------------------------------------
    -
    -
    7
    sed works by making only one pass over the input(s), and is consequently more
    -----------------------------------------------------------------------------
    9
    efficient. But it is sed's ability to filter text in a pipeline which particular
    l
    y
    --------------------------------------------------------------------------------
    -
    -
    意思是分析 sedtest.txt ,显示那些包含 is 串的匹配行的行号,注意 11 行中出现了 is 字符串
    这个输出是面向 stdout 的,如果不做重定向处理,则不影响原来的 sedtest.txt
    在匹配行后面增加文本 [/pattern/]a\ 或者 [address]a\
    ^D
    sed -f sedadd.script sedtest.txt
    Sed is a stream editor
    A stream editor is used to perform basic text transformations on an input stream
    While in some ways similar to an editor which permits scripted edits (such as ed
    )
    ,
    --------------------------------------------------------------------------------
    -
    -
    sed works by making only one pass over the input(s), and is consequently more
    -----------------------------------------------------------------------------
    efficient. But it is sed's ability to filter text in a pipeline which particular
    l
    y
    --------------------------------------------------------------------------------
    -
    -
    [scz@ /home/scz/src]> sed -e "a\\
    +++++++++
    ---------------------------------------------
    找到包含 from 字符串的行,在该行的下一行增加 +++++++++
    这个输出是面向 stdout 的,如果不做重定向处理,则不影响原来的 sedtest.txt
    很多人想在命令行上直接完成这个操作而不是多一个 sedadd.script ,不幸的是,这需要用 续行符 \
    [scz@ /home/scz/src]> sed -e "/from/a\\
    +++++++++" sedtest.txt
    [scz@ /home/scz/src]> sed -e "a\\
    +++++++++" sedtest.txt
    上面这条命令将在所有行后增加一个新行 +++++++++
    [scz@ /home/scz/src]> sed -e "1 a\\
    +++++++++" sedtest.txt
    把下面这两行 copy/paste 到一个 shell 命令行上,效果一样
    +++++++++" sedtest.txt
    [address]a\
    只接受一个地址指定
    对于 a 命令,不支持单引号,只能用双引号,而对于 d 命令等其他命令,同时支持
    删除匹配行 [/pattern/]d 或者 [address1][,address2]d
    sed -e '/---------------------------------------------/d' sedtest.txt
    Sed is a stream editor
    A stream editor is used to perform basic text transformations on an input stream
    While in some ways similar to an editor which permits scripted edits (such as ed
    )
    ,
    sed works by making only one pass over the input(s), and is consequently more
    efficient. But it is sed's ability to filter text in a pipeline which particular
    l
    y
    sed -e '6,10d' sedtest.txt
    删除 6-10 行的内容,包括 6 10
    sed -e "2d" sedtest.txt
    删除第 2 行的内容
    sed "1,/^$/d" sedtest.txt
    删除从第一行到第一个空行之间的所有内容
    注意这个命令很容易带来意外的结果,当 sedtest.txt 中从第一行开始并没有空行,则 sed 除所有行
    sed "1,/from/d" sedtest.txt
    删除从第一行到第一个包含 from 字符串的行之间的所有内容,包括第一个包含 from 字符串的行。
    替换匹配行 [/pattern/]c\ 或者 [address1][,address2]c\
    sed -e "/is/c\\
    **********" sedtest.txt
    寻找所有包含 is 字符串的匹配行,替换成 **********
    **********
    ----------------------
    **********
    --------------------------------------------------------------------------------
    While in some ways similar to an editor which permits scripted edits (such as ed
    )
    ,
    --------------------------------------------------------------------------------
    -
    -
    **********
    -----------------------------------------------------------------------------
    **********
    --------------------------------------------------------------------------------
    -
    sed -e "1,11c\\
    **********" sedtest.txt----------------------
    1-12 行内搜索所有 from 字符串,分别替换成 **** 字符串
    限定范围后的模式匹配
    sed "/But/s/is/are/g" sedtest.txt
    对那些包含 But 字符串的行,把 is 替换成 are
    sed "/is/s/t/T/" sedtest.txt
    对那些包含 is 字符串的行,把每行第一个出现的 t 替换成 T
    sed "/While/,/from/p" sedtest.txt -n
    输出在这两个模式匹配行之间的所有内容
    指定替换每一行中匹配的第几次出现
    sed "s/is/are/5" sedtest.txt
    把每行的 is 字符串的第 5 次出现替换成 are
    & 代表最后匹配
    sed "s/^$/(&)/" sedtest.txt
    给所有空行增加一对 ()
    sed "s/is/(&)/g" sedtest.txt
    给所有 is 字符串外增加 ()
    sed "s/.*/(&)/" sedtest.txt
    给所有行增加一对 ()
    sed "/is/s/.*/(&)/" sedtest.txt
    给所有包含 is 字符串的行增加一对 ()
    利用 sed 修改 PATH 环境变量
    先查看 PATH 环境变量
    [scz@ /home/scz/src]> echo $PATH
    /usr/bin:/usr/bin:/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/X11R6/bin:.
    去掉尾部的 { :/usr/X11R6/bin:. }
    [scz@ /home/scz/src]> echo $PATH | sed "s/^\(.*\) :\/ usr[/] X11R6\/ bin:[.]$/\1 /"
    /usr/bin:/usr/bin:/bin:/usr/local/bin:/sbin:/usr/sbin
    去掉中间的 { :/bin: }
    [scz@ /home/scz/src]> echo $PATH | sed "s/^\(.*\) :\/ bin:\(.*\) $/\1 \2 /"
    /usr/bin:/usr/bin/usr/local/bin:/sbin:/usr/sbin:/usr/X11R6/bin:.
    [/]
    表示 / 失去特殊意义
    \/
    同样表示 / 失去意义
    \1
    表示子匹配的第一次出现
    \2
    表示子匹配的第二次出现
    \(.*\)
    表示子匹配
    去掉尾部的 : ,然后增加新的路径
    PATH=`echo $PATH | sed 's/\(.*\):$/\1/'`:$HOME/src
    注意反引号 ` 和单引号 ' 的区别。

    测试并提高 sed 命令运行效率
    time sed -n "1,12p" webkeeper.db > /dev/null
    time sed 12q webkeeper.db > /dev/null
    可以看出后者比前者效率高。
    [address]q
    当碰上指定行时退出 sed 执行
    指定输出文件 [address1][,address2]w outputfile
    sed "1,10w sed.out" sedtest.txt -n
    sedtest.txt 1-10 行的内容写到 sed.out 文件中。
    指定输入文件 [address]r inputfile
    sed "1r sedappend.txt" sedtest.txt
    sedappend.txt 中的内容附加到 sedtest.txt 文件的第一行之后
    替换相应字符 [address1][,address2]y/old/new/
    sed "y/abcdef/ABCDEF/" sedtest.txt
    sedtest.txt 中所有的 abcdef 小写字母替换成 ABCDEF 大写字母。
    ! 号的使用
    sed -e '3,7!d' sedtest.txt
    删除 3-7 行之外的所有行
    sed -e '1,/from/!d' sedtest.txt
    找到包含 from 字符串的行,删除其后的所有行
    \c 正则表达式 c 的使用
    sed -e "\:from:d" sedtest.txt
    等价于 sed -e "/from/d" sedtest.txt
    sed 命令中正则表达式的复杂性
    cat > sedtest.txt
    ^\/[}]{.*}[\(]$\)
    ^D
    如何才能把该行替换成
    \(]$\)\/[}]{.*}^[
    转换 man 手册成普通文本格式 ( )
    man sed | col -b > sed.txt
    sed -e "s/^H//g" -e "/^$/d" -e "s/^^I/ /g" -e "s/^I/ /g" sed.txt > sedman
    txt
    删除所有退格键、空行,把行首的制表符替换成 8 个空格,其余制表符替换成一个空格。
    sed man 手册 ( 用的就是上面的方法 )
    NAME
    sed - a Stream EDitor
    SYNOPSIS
    sed [-n] [-V] [--quiet] [--silent] [--version] [--help]
    [-e script] [--expression=script]
    [-f script-file] [--file=script-file]
    [script-if-no-other-script]
    [file...]
    DESCRIPTION
    Sed is a stream editor. A stream editor is used to per-
    form basic text transformations on an input stream (a file
    or input from a pipeline). While in some ways similar to
    an editor which permits scripted edits (such as ed), sed
    works by making only one pass over the input(s), and is
    consequently more efficient. But it is sed's ability to
    filter text in a pipeline which particularly distinguishes
    it from other types of editors.
    OPTIONS
    Sed may be invoked with the following command-line
    options:
    -V
    --version
    Print out the version of sed that is being run and
    a copyright notice, then exit.
    -h
    --help Print a usage message briefly summarizing these
    command-line options and the bug-reporting address,
    then exit.
    -n
    --quiet
    --silent
    By default, sed will print out the pattern space at
    the end of each cycle through the script. These
    options disable this automatic printing, and sed
    will only produce output when explicitly told to
    via the p command.
    -e script
    --expression=script
    Add the commands in script to the set of commands
    to be run while processing the input.
    -f script-file
    --file=script-file
    Add the commands contained in the file script-file
    to the set of commands to be run while processing
    the input.
    If no -e,-f,--expression, or --file options are given on
    the command-line, then the first non-option argument on
    the command line is taken to be the script to be executed.
    If any command-line parameters remain after processing the
    above, these parameters are interpreted as the names of
    input files to be processed. A file name of - refers to
    the standard input stream. The standard input will pro-
    cessed if no file names are specified.
    Command Synopsis
    This is just a brief synopsis of sed commands to serve as
    a reminder to those who already know sed; other documenta-
    tion (such as the texinfo document) must be consulted for
    fuller descriptions.
    Zero-address ``commands''
    : label
    Label for b and t commands.
    #comment
    The comment extends until the next newline (or the
    end of a -e script fragment).
    } The closing bracket of a { } block.
    Zero- or One- address commands
    = Print the current line number.
    a \
    text Append text, which has each embedded newline pre-
    ceeded by a backslash.
    i \
    text Insert text, which has each embedded newline pre-
    ceeded by a backslash.
    q Immediately quit the sed script without processing
    any more input, except that if auto-print is not
    diabled the current pattern space will be printed.
    r filename
    Append text read from filename.
    Commands which accept address ranges
    { Begin a block of commands (end with a }).
    b label
    Branch to label; if label is omitted, branch to end
    of script.
    t label
    If a s/// has done a successful substitution since
    the last input line was read and since the last t
    command, then branch to label; if label is omitted,
    branch to end of script.
    c \
    text Replace the selected lines with text, which has
    each embedded newline preceeded by a backslash.
    d Delete pattern space. Start next cycle.
    D Delete up to the first embedded newline in the pat-
    tern space. Start next cycle, but skip reading
    from the input if there is still data in the pat-
    tern space.
    h H Copy/append pattern space to hold space.
    g G Copy/append hold space to pattern space.
    x Exchange the contents of the hold and pattern
    spaces.
    l List out the current line in a ``visually unambigu-
    ous'' form.
    n N Read/append the next line of input into the pattern
    space.
    p Print the current pattern space.
    P Print up to the first embedded newline of the cur-
    rent pattern space.
    s/regexp/replacement/
    Attempt to match regexp against the pattern space.
    If successful, replace that portion matched with
    replacement. The replacement may contain the spe-
    cial character & to refer to that portion of the
    pattern space which matched, and the special
    escapes \1 through \9 to refer to the corresponding
    matching sub-expressions in the regexp.
    w filename Write the current pattern space to file-
    name.
    y/source/dest/
    Transliterate the characters in the pattern space
    which appear in source to the corresponding charac-
    ter in dest.
    Addresses
    Sed commands can be given with no addresses, in which case
    the command will be executed for all input lines; with one
    address, in which case the command will only be executed
    for input lines which match that address; or with two
    addresses, in which case the command will be executed for
    all input lines which match the inclusive range of lines
    starting from the first address and continuing to the sec-
    ond address. Three things to note about address ranges:
    the syntax is addr1,addr2 (i.e., the addresses are sepa-
    rated by a comma); the line which addr1 matched will
    always be accepted, even if addr2 selects an earlier line;
    and if addr2 is a regexp, it will not be tested against
    the line that addr1 matched.
    After the address (or address-range), and before the com-
    mand, a ! may be inserted, which specifies that the com-
    mand shall only be executed if the address (or address-
    range) does not match.
    The following address types are supported:
    number Match only the specified line number.
    first~step
    Match every step'th line starting with line first.
    For example, ``sed -n 1~2p'' will print all the
    odd-numbered lines in the input stream, and the
    address 2~5 will match every fifth line, starting
    with the second. (This is a GNU extension.)
    $ Match the last line.
    /regexp/
    Match lines matching the regular expression regexp.
    \cregexpc
    Match lines matching the regular expression regexp.
    The c may be any character.
    Regular expressions
    POSIX.2 BREs should be supported, but they aren't com-
    pletely yet. The \n sequence in a regular expression
    matches the newline character. There are also some GNU
    extensions. [XXX FIXME: more needs to be said. At the
    very least, a reference to another document which
    describes what is supported should be given.]
    Miscellaneous notes
    This version of sed supports a \<newline> sequence in all
    regular expressions, the replacement part of a substitute
    (s) command, and in the source and dest parts of a
    transliterate (y) command. The \ is stripped, and the
    newline is kept.
    SEE ALSO
    awk(1), ed(1), expr(1), emacs(1), perl(1), tr(1), vi(1),
    regex(5) [well, one ought to be written... XXX], sed.info,
    any of various books on sed, the sed FAQ
    (http://www.wollery.demon.co.uk/sedtut10.txt,
    http://www.ptug.org/sed/sedfaq.htm).
    BUGS
    E-mail bug reports to bug-gnu-utils@gnu.org. Be sure to
    include the word ``sed'' somewhere in the ``Subject:''
    field.

     

    展开全文
  • 史上最详细sed用法

    千次阅读 2017-10-30 14:38:21
    sed命令可以批量替换多个文件中的字符串。 命令如下: sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录` 例如:我要把 charset=gb2312 替换为 charset=UTF-8,执行命令: sed -i "s/charset=...

    Linux下批量替换多个文件中的字符串的简单方法。用sed命令可以批量替换多个文件中的字符串。

    命令如下:

    sed -i "s/原字符串/新字符串/g" `grep 原字符串 -rl 所在目录`

    例如:我要把 charset=gb2312 替换为 charset=UTF-8,执行命令:

    sed -i "s/charset=gb2312/charset=UTF-8/g" `grep charset=gb2312 -rl /www`

    即可。

     

    解释一下:

    -i 表示inplace edit,就地修改文件

    -r 表示搜索子目录

    -l 表示输出匹配的文件名

    这个命令组合很强大,要注意备份文件。

     

    关于 sed 的更多说明:

    1. sed ‘y/1234567890/ABCDEFGHIJ/’ test_sed

    test_sed的内容是:

    1234567890

    2345678901

    3456789012

    4567890123

    执行后,test_sed的内容是:

    ABCDEFGHIJ

    BCDEFGHIJA

    CDEFGHIJAB

    DEFGHIJABC

    注意变换关系是按两个list的位置对应变换

    2. 替换每行所有匹配

    sed 's/01/Ab/g' test_sed

    1234567890

    23456789Ab

    3456789Ab2

    456789Ab23

    注意:第一行的0,1没有分别替换为A,b

     

    删除:d命令

    $ sed '2d' example

    删除example文件的第二行。

    $ sed '2,$d' example

    删除example文件的第二行到末尾所有行。

    $ sed '$d' example

    删除example文件的最后一行。

    $ sed '/test/'d example

    删除example文件所有包含test的行。

     

    替换:s命令

    $ sed 's/test/mytest/g' example
    在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。

    $ sed -n 's/^test/mytest/p' example
    (-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。

    $ sed 's/^192.168.0.1/&localhost/'example
    &符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost。

    $ sed -n 's/\(love\)able/\1rs/p' example
    love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。

    $ sed 's#10#100#g' example
    不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。

     

    选定行的范围:逗号

    $ sed -n '/test/,/check/p' exampl
    所有在模板test和check所确定的范围内的行都被打印。

    $ sed -n '5,/^test/p' example
    打印从第五行开始到第一个包含以test开始的行之间的所有行。

    $ sed '/test/,/check/s/$/sed test/' example
    对于模板test和west之间的行,每行的末尾用字符串sed test替换。

     

    多点编辑:e命令

    $ sed -e '1,5d' -e 's/test/check/'example
    (-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

    $ sed --expression='s/test/check/' --expression='/love/d' example
    一个比-e更好的命令是–expression。它能给sed表达式赋值。

     

    从文件读入:r命令

    $ sed '/test/r file' example
    file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。

     

    写入文件:w命令
    $ sed -n '/test/w file' example
    在example中所有包含test的行都被写入file里。

     

    追加命令:a命令

    $ sed '/^test/a\\--->this is a example' example<
    ‘this is a example’被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。

     

    插入:i命令

    $ sed '/test/i\\
    new line
    -------------------------' example

    如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。

     

    下一个:n命令

    $ sed '/test/{ n; s/aa/bb/; }' example
    如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。

     

    变形:y命令

    $ sed '1,10y/abcde/ABCDE/' example
    把1–10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。

     

    退出:q命令

    $ sed '10q' example
    打印完第10行后,退出sed。

     

    保持和获取:h命令和G命令

    $ sed -e '/test/h' -e '$Gexample
    在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。

     

    保持和互换:h命令和x命令
    $ sed -e '/test/h' -e '/check/x' example
    互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。

    展开全文
  • shell脚本--sed的用法

    万次阅读 多人点赞 2019-04-30 16:16:07
    sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过。 sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配...

    sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过

    sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。本文主要介绍sed的一些基本用法,并通过shell脚本演示sed的使用实例。

    1.sed的使用方法,调用sed 命令的语法有两种:

    一.在命令行指定sed指令对文本进行处理:sed +选项  ‘指令’ 文件

    二.先将sed指令保存到文件中,将该文件作为参数进行调用:sed   +选项  -f  包含sed指令的文件  文件

    sed的常用选项:

    -e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项

    -f:后跟保存了sed指令的文件

    -i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改

    -n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行

    sed中的编辑命令:

    a:追加  向匹配行后面插入内容

    c:更改  更改匹配行的内容

    i:插入  向匹配行前插入内容

    d:删除  删除匹配的内容

    s:替换  替换掉匹配的内容

    p:打印  打印出匹配的内容,通常与-n选项和用

    =:用来打印被匹配的行的行号

    n:读取下一行,遇到n时会自动跳入下一行

    r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件

    2.sed命令实例:

    示例1:向文件中添加或插入行

    sed '3ahello' 1.txt   #向第三行后面添加hello,3表示行号

    sed '/123/ahello' 1.txt #向内容123后面添加hello,如果文件中有多行包括123,则每一行后面都会添加

    sed  '$ahello'  1.txt  #在最后一行添加hello

    sed '3ihello'  1.txt    #在第三行之前插入hello

    sed '/123/ihello'  1.txt   #在包含123的行之前插入hello,如果有多行包含123,则包含123的每一行之前都会插入hello

    sed '$ihello'  1.txt     #在最后一行之前插入hello

    示例2:更改文件中指定的行

    sed  '1chello'  1.txt  #将文件1.txt的第一行替换为hello

    sed  '/123/chello'  1.txt  #将包含123的行替换为hello

    sed '$chello'  1.txt  #将最后一行替换为hello

    示例3:删除文件中的行

    sed  '4d'  1.txt    #删除第四行

    sed '1~2d' 1.txt   #从第一行开始删除,每隔2行就删掉一行,即删除奇数行

    sed   '1,2d'  1.txt   #删除1~2行

    sed  '1,2!d'  1.txt   #删除1~2之外的所有行

    sed  '$d'   1.txt      #删除最后一行

    sed  '/123/d'   1.txt   #删除匹配123的行

    sed  '/123/,$d'  1.txt  #删除从匹配123的行到最后一行

    sed  '/123/,+1d'  1.txt   #删除匹配123的行及其后面一行

    sed  '/^$/d'    1.txt    #删除空行

    sed   '/123\|abc/!d'  1.txt    #删除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反

    sed  '1,3{/123/d}'   1.txt     #删除1~3行中,匹配内容123的行,1,3表示匹配1~3行,{/123/d}表示删除匹配123的行

    示例4:替换文件中的内容

    sed  's/123/hello/'   1.txt   #将文件中的123替换为hello,默认只替换每行第一个123

    sed  's/123/hello/g'  1.txt #将文本中所有的123都替换为hello

    sed 's/123/hello/2'   1.txt  #将每行中第二个匹配的123替换为hello

    sed  -n 's/123/hello/gpw  2.txt'   1.txt    #将每行中所有匹配的123替换为hello,并将替换后的内容写入2.txt

    sed  '/#/s/,.*//g'  1.txt   #匹配有#号的行,替换匹配行中逗号后的所有内容为空  (,.*)表示逗号后的所又内容

    sed  's/..$//g'  1.txt  #替换每行中的最后两个字符为空,每个点代表一个字符,$表示匹配末尾  (..$)表示匹配最后两个字符

    sed 's/^#.*//'  1.txt      #将1.txt文件中以#开头的行替换为空行,即注释的行  ( ^#)表示匹配以#开头,(.*)代表所有内容

    sed 's/^#.*//;/^$/d'  1.txt  #先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开

    sed 's/^[0-9]/(&)/'   1.txt   #将每一行中行首的数字加上一个小括号   (^[0-9])表示行首是数字,&符号代表匹配的内容

    或者  sed 's/\(^[0-9]\)/(\1)/'   1.txt  #替换左侧特殊字符需钥转义,右侧不需要转义,\1代表匹配的内容

    sed  's/$/&'haha'/'  1.txt   # 在1.txt文件的每一行后面加上"haha"字段

    示例5:打印文件中的行

    sed  -n '3p'  1.txt   #打印文件中的第三行内容

    sed  -n '2~2p'  1.txt   #从第二行开始,每隔两行打印一行,波浪号后面的2表示步长

    sed -n '$p'  1.txt  #打印文件的最后一行

    sed -n '1,3p'  1.txt  #打印1到3行

    sed  -n '3,$p'  1.txt  #打印从第3行到最后一行的内容

    sed  -n '/you/p'  1.txt   #逐行读取文件,打印匹配you的行

    sed  -n '/bob/,3p'  1.txt  #逐行读取文件,打印从匹配bob的行到第3行的内容

    sed  -n  '/you/,3p'  1.txt  #打印匹配you 的行到第3行,也打印后面所有匹配you 的行

    sed  -n '1,/too/p'  1.txt    #打印第一行到匹配too的行

    sed  -n  '3,/you/p'  1.txt   #只打印第三行到匹配you的行

    sed  -n '/too/,$p'  1.txt  #打印从匹配too的行到最后一行的内容

    sed  -n '/too/,+1p'  1.txt    #打印匹配too的行及其向后一行,如果有多行匹配too,则匹配的每一行都会向后多打印一行

    sed  -n '/bob/,/too/p'  1.txt   #打印从匹配内容bob到匹配内容too的行

    示例6:打印文件的行号

    sed  -n "$="   1.txt   #打印1.txt文件最后一行的行号(即文件有多少行,和wc -l 功能类似)

    sed  -n '/error/='  1.txt     #打印匹配error的行的行号

    sed  -n '/error/{=;p}'   1.txt    #打印匹配error的行的行号和内容(可用于查看日志中有error的行及其内容)

    示例7:从文件中读取内容

    sed  'r 2.txt'  1.txt  #将文件2.txt中的内容,读入1.txt中,会在1.txt中的每一行后都读入2.txt的内容

    sed '3r 2.txt'  1.txt       #在1.txt的第3行之后插入文件2.txt的内容(可用于向文件中插入内容)

    sed  '/245/r   2.txt'   1.txt    #在匹配245的行之后插入文件2.txt的内容,如果1.txt中有多行匹配456则在每一行之后都会插入

    sed  '$r  2.txt'   1.txt     #在1.txt的最后一行插入2.txt的内容

    示例8:向文件中写入内容

    sed  -n  'w 2.txt'   1.txt   #将1.txt文件的内容写入2.txt文件,如果2.txt文件不存在则创建,如果2.txt存在则覆盖之前的内容

    sed   -n '2w  2.txt'   1.txt   #将文件1.txt中的第2行内容写入到文件2.txt

    sed  -n -e '1w  2.txt'  -e '$w 2.txt'   1.txt   #将1.txt的第1行和最后一行内容写入2.txt

    sed  -n -e '1w  2.txt'  -e '$w  3.txt'  1.txt   #将1.txt的第1行和最后一行分别写入2.txt和3.txt

    sed  -n  '/abc\|123/w  2.txt'    1.txt   #将1.txt中匹配abc或123的行的内容,写入到2.txt中

    sed  -n '/666/,$w 2.txt'   1.txt   #将1.txt中从匹配666的行到最后一行的内容,写入到2.txt中

    sed  -n  '/xyz/,+2w  2.txt'     1.txt     #将1.txt中从匹配xyz的行及其后2行的内容,写入到2.txt中

    示例9:sed 在shell脚本中的使用

    实例1:替换文件中的内容

    #!/bin/bash
    if [ $# -ne 3 ];then            #判断参数个数
      echo "Usage:  $0 old-part new-part filename"    #输出脚本用法
      exit
    fi

    sed -i "s#$1#$2#"  $3          #将 旧内容进行替换,当$1和$2中包含"/"时,替换指令中的定界符需要更换为其他符号

    实例2:删除文件中的空白行

    #!/bin/bash

    if [ ! -f $1 ];then         #判断参数是否为文件且存在

       echo "$0 is not a file"

       exit

    fi

    sed -i "/^$/d"   $1 #将空白行删除

    实例3:格式化文本内容

    #!/bin/bash
    a='s/^  *>//      #定义一个变量a保存sed指令,'s/^ *>//':表示匹配以0个或多空格开头紧跟一个'>'号的行,将匹配内容替换
    s/\t*//                 #'s/\t*//':表示匹配以0个或多个制表符开头的行,将匹配内容替换

    s/^>//               #'s/^>//' :表示匹配以'>'开头的行,将匹配内容替换

    s/^ *//'               #'s/^ *//':表示匹配以0个或多个空格开头的行,将匹配内容替换
    #echo $a
    sed "$a" $1        #对用户给定的文本文件进行格式化处理

    实用脚本:批量更改当前目录中的文件后缀名:

    示例1:

    #!/bin/bash
    if [ $# -ne 2 ];then               #判断用户的输入,如果参数个数不为2则打印脚本用法
      echo "Usage:$0 + old-file new-file"
      exit
    fi
    for i in *$1*                         #对包含用户给定参数的文件进行遍历
    do
      if [ -f $i ];then
         iname=`basename $i`        #获取文件名
         newname=`echo $iname | sed -e "s/$1/$2/g"`         #对文件名进行替换并赋值给新的变量
         mv  $iname  $newname          #对文件进行重命名
       fi
    done

    exit 666

    示例2:

    #!/bin/bash
    read -p "input the old file:" old        #提示用户输入要替换的文件后缀
    read -p "input the new file:" new
    [ -z $old ] || [ -z $new ] && echo "error" && exit      #判断用户是否有输入,如果没有输入怎打印error并退出
    for file in `ls *.$old`
    do
      if [ -f $file ];then
         newfile=${file%$old}                        #对文件进行去尾
         mv $file ${newfile}$new                   #文件重命名
      fi

    done

    示例3:

    #!/bin/bash

    if [ $# -ne 2 ];then        #判断位置变量的个数是是否为2
       echo "Usage:$0  old-file  new-file"
       exit
    fi
    for file in `ls`                      #在当前目录中遍历文件
    do
      if [[ $file =~ $1$ ]];then   #对用户给出的位置变量$1进行正则匹配,$1$表示匹配以变量$1的值为结尾的文件
         echo $file                      #将匹配项输出到屏幕进行确认
         new=${file%$1}             #对文件进行去尾处理,去掉文件后缀保留文件名,并将文件名赋给变量new                  
         mv $file ${new}$2          #将匹配文件重命名为:文件名+新的后缀名
      fi

    done

    展开全文
  • Linux三大剑客之sed

    万次阅读 2018-02-11 11:15:21
    sed由自由软件基金组织(FSF)开发和维护,并且随着GNU/Linux进行分发,通常它也称作 GNU sed。本文将按照GUN官方在线手册的内容对sed进行介绍。 二、获取帮助信息 [sed@GeekDevOps ~]$ sed --help [sed@G...
  • Linux三剑客awk sed grep全攻略
  • 一、Linux三剑客之awk命令精讲第1章 awk基础入门1.1 awk简介awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告(excel)。处理的数据可以是一个或多个文件,可以是来自标准输入,...
  • sed & awk之sed实战

    2020-09-15 10:46:51
    任务 数据文件见snp_result.txt 此文件为从db_snp下载下来的一些snp位点信息,一共包括211个snp位点,每个位点结构大致如下: 140. rs3732219 [Homo sapiens] SNV:C>T Chromosome: 2:233718602 (GRCh38) ...
  • Linux—sed工具

    万次阅读 2018-11-07 16:06:11
    &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;...amp
  • sed命令

    万次阅读 2018-11-02 19:04:37
    1、sed主要以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作 sed命令格式: sed [optins] ‘commmand’ file 如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。 ...
  • sed去掉字符串所有空格

    万次阅读 2008-07-13 17:37:00
    echo $VAR | sed s/ //g
  • 使用sed输出文件的指定行

    万次阅读 2016-07-27 09:13:38
    sed ‘/pattern/!p’ infile //匹配pattern的行不输出 sed -n ‘1,2p’ infile //print line 1 to 2 sed -n ‘2,$p’ file //print line 2 to end of line
  • sed命令:删除匹配行和替换

    万次阅读 2014-08-08 17:09:30
    sed
  • sed向文件末尾添加内容

    万次阅读 2014-05-14 09:44:28
    1) sed '/$/a\\n' test.txt,可以在文件的每行末尾添加一个回车 2) sed '$a\eof' test.txt,可以在文件的末尾添加'eof'
  • sed 中带变量的情况

    万次阅读 2017-07-08 11:26:30
    #teststr="IBM" sed -n '/"$teststr"/'
  • sed替换成换行符/回车符

    万次阅读 2017-08-24 18:40:03
    举例介绍将分号变成换行符 方法一echo "a;b" | sed 's/;/\n/g'方法二echo "a;b" | sed 's/;/\ /g' 该方法适用一些老版本(方法一无效),注意 换行 前的转义符
  • sed-i 命令在文件第一行添加内容

    万次阅读 2017-06-07 15:30:29
    sed的i\命令在第一行前面插入即可,加上 -i 选项直接操作文件。 sed -i '1i\要添加的内容' yourfile 查看插入第一行是否成功 sed -n '1,1p' yourfile
  • sed在行首添加字符串; sed ‘s/^/xxx/' filename >output:^符号代表行首 sed在行尾添加字符串; sed ‘s/$/string/' filename>output:$符号代表行尾 sed在匹配某行后添加一行字符串: sed '/...
  • sed中引入shell变量的四种方法

    万次阅读 2017-03-15 10:06:29
    今天在写一个脚本遇到问题,----需要在sed中引入shell变量,在网上搜了变天才找到,经过测试 这四种方法都可用,在这里跟大家分享下,=---同时谢谢netman大哥,前辈就是前辈哈哈 1.eval sed ’s/$a/$b/’ ...
  • sed删掉某一特定字符的行

    万次阅读 2017-12-07 16:23:42
    sed -i '/关键字符/d' 文件名
1 2 3 4 5 ... 20
收藏数 174,568
精华内容 69,827
关键字:

sed