首页 > 网站搭建 > 技术分享内容详情

sed命令大全:详细解析所有常用用法 2025-01-18 浏览量: 来源:网络

sed编辑器介绍
sed(Stream Editor)是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。sed是一种流编辑器,它是文本处理中非常实用的工具,能够完美的配合正则表达式使用,功能不同凡响。
流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。处理文本时,sed把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
sed编辑器工作流程
sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。
在可视化编辑器中,通常无需多想就可以在文本文件中找到需要更改的内容。我们的眼睛(或屏幕阅读器)扫描文本,找到要更改的单词或要插入或删除文本的位置,然后开始输入。不过,sed 没有交互模式,因此我们必须告诉它必须满足哪些条件才能运行特定命令。
sed编辑器的工作流程主要包括读取、执行和显示三个过程:
   ➤读取:sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space);
   ➤执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行;
   ➤显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
sed命令的基本语法
    sed [options] 'command' file(s)sed [options] scriptfile file(s)#举例如下:sed -e '格式' 文件1 文件2 ...sed -n -e ‘操作’ 文件1 文件2 ...sed -f 脚本文件 文件1 文件2 ...sed -i -e '操作' 文件1 文件2 ...sed -e 'n {操作1 操作2...}' 文件1 文件2 ...
    其中:

       options:可以是 -e(表达式),-f(脚本文件)等。

      command/scriptfile:包含一个或多个 sed 命令,也可以是脚本文件。

       file(s):要处理的文本文件。

    常用的sed命令选项
      -e或--expression=: 表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用;-f或--file=: 表示用指定的脚本文件来处理输入的文本文件;-i[SUFFIX]: 直接修改目标文本文件,如果设置了SUFFIX后缀名,sed会将数据备份;-n、--quiet或silent: 禁止自动打印模式空间内容,仅显示script处理后的结果;-r:启用扩展的正则表达式语法(在某些版本中使用-E选项);

      常用的sed编辑指令
        s:替换模式匹配的文本;i\文本:在匹配的数据行前插入文本;a\文本:在匹配的数据行后追加文本;c\文本:用新文本替换匹配数据行的整行内容;r 文件:将文件的内容插入到当前行之后;w 文件:将当前匹配到的数据写入指定的文件中;l:小写L,打印当前匹配的数据行(显示控制字符,如回车符等);=:打印当前读取的数据所在的行数;q:[exit code] 立刻退出sed脚本;d:删除当前模式空间内容,并读取新内容;D:删除当前模式空间开头至\n的内容;h:将当前模式空间中内容覆盖至保持空间;H:将当前模式空间中内容追加至保持空间;g:将当前保持空间中内容覆盖至模式空间;G:将当前保持空间中内容追加至模式空间;n:提前读取下一行,覆盖模型空间前一行;N:追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符;p:打印当前模式空间内容,追加到默认输出之后;P:打印当前模式空间开始至\n的内容,并追加到默认输出之前;x:将当前保持空间和模式空间内容互换;y:字符转换,转换前后的字符长度必须相同;&:表示已匹配字符串标记;
        常用的sed元字符集
          ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。& 保存搜索字符用来替换其他字符,如s/love/**&**/,love变成**love**。\< 匹配单词的开始,如:/\<love/匹配包含以love开头的单词的行。\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。

          常用示例

          以下示例,假设文件123.txt包含如下内容:

            $ cat 123.txtonetwothreefourfivesixseveneightnineten

            指定行号并打印它。因为sed处理后的默认操作也是将一行打印到stdout,所以会产生复制一行的效果:

              $ sed '1p' 123.txtoneonetwothreefourfivesixseveneightnineten

              p: 打印(通常与“-n”选项一起使用),如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出:

                $ sed 'p' 123.txtoneonetwotwothreethreefourfourfivefivesixsixsevenseveneighteightnineninetenten$ sed -n 'p' 123.txtonetwothreefourfivesixseveneightnineten

                也可以按步长指定行号并打印。例如,1~2表示每两行选择一次(从第一行开始每两行选择一次),1~3表示每三行选择一次:

                  $ sed '1~2p' 123.txtoneonetwothreethreefourfivefivesixsevenseveneightninenineten$ sed '1~3p' 123.txtoneonetwothreefourfourfivesixsevenseveneightninetenten

                  使用$来操作文件的最后一行:

                    $ sed '$p' 123.txtonetwothreefourfivesixseveneightninetenten

                    也可以选择多行(例如,sed '1,$p' 打印第一行和最后一行)。

                    任何按数字或位置选择的内容,都可以用感叹号 (!) 字符反转。如下示例将选择除第最后一行之外的所有行:

                      $ sed '$!p' 123.txtoneonetwotwothreethreefourfourfivefivesixsixsevenseveneighteightninenineten

                      =:打印行号(使用sed '='或sed -n '=;p'):

                        $ sed '=' 123.txt1one2two3three4four5five6six7seven8eight9nine10ten

                        上面的输出行号跟内容不在同一行,将输出通过管道传给另一个sed命令处理就完美了:

                          $ sed '=' 123.txt | sed 'N;s/\n/: /'1: one2: two3: three4: four5: five6: six7: seven8: eight9: nine10: ten
                          # 备注:# =-代表行号# N-追加下一行至当前处理行的后面,组成一个新行来处理# s/\n/: /-替换,这里是将换行符/n替换为:
                          l (小写L):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
                            $ sed -n 'l' 123.txtone$two$three$four$five$six$seven$eight$nine$ten$
                            有关指定行打印的相关示例:
                              sed -n '1,3p' 123.txt      #打印一到三行sed -n '3,$p' 123.txt      #打印三到最后一行sed -n '$=;$p' 123.txt     #打印最后一行显示行号sed -n '1, +3p' 123.txt    #打印1之后的连续3行,即1-4行sed '3q' 123.txt           #打印前3行信息后退出,q表示退出sed -n 'p;n' 123.txt       #打印奇数行; n表示移动到下一行sed -n 'n;p' 123.txt       #打印偶数行sed -n '2,${n;p}' 123.txt  #从第二行开始,n移动下一行,p打印,表示打印奇数行sed -n '2,${p;n}' 123.txt  #从第二行开始,n移动下一行,p打印,表示打印偶数行
                              有关匹配打印的相关示例:
                                $ sed -n ' /th/p' 123.txt   #//搜索包含th的行进行打印,区分大小写three$ sed -n ' /^f/p' 123.txt   #搜索以f开头的行进行打印fourfive$ sed -n '/ne$/p' 123.txt   #打印以ne结尾的行onenine$ sed -n '/tw\|th/p' 123.txt#搜索包含tw或者th的行进行打印twothree$ sed -n '2,/th/p' 123.txt  #从第二行开始打印到第一个包含th的行
                                $ sed -nr '/re{1,}e/p' 123.txt #-r表示支持正则表达式three
                                有关删除行的相关示例:
                                  sed 'd' 123.txt          #不指定行号,全部删除sed '3d' 123.txt         #删除第3行sed '2,4d' 123.txt       #删除2-4行sed '$d' 123.txt         #删除最后一行sed '/^$/d' 123.txt      #删除空行sed '/th$/d' 123.txt      #删除包含th字符的行sed '/th$/!d' 123.txt     #不删除包含nologin的行sed '/se/,/te/d' 123.txt #遇到twelve开启删除,遇到fifteen关闭删除

                                  相关标签: Linux IT技术分享 跨境电商 虚拟货币 独立站

                                  Copyright © 2016-2025 帆笛跨境网 · 版权所有

                                  联系我们

                                  全国服务热线

                                  4008105666

                                  E-mail:support@myfindy.com‬

                                  地 址:中国 · 成都

                                  帆笛跨境客服微信二维码
                                  扫一扫,加微信

                                  Copyright © 2016-2025 帆笛跨境网 · 版权所有