sed用法

sed常用语法

sed是什么?

是一种用于文本处理的流式编辑器,常用于替换、删除、插入、打印等操作。

sed语句只显示处理之后的结果,但是文本本身是没有被处理的,除加特殊用法:
特殊用法:
sed  -r:sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法《正则表达式》) 
     -i:直接修改读取的文件内容,而不是输出到终端。
     -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
     -e :直接在命令列模式上进行 sed 的动作编辑;
     -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;

sed的基本语法如下:

sed [options] [script] [input_file]

options:用于指定sed的选项,如-i用于直接修改原始文件、-n用于禁止默认输出等。
script:包含一系列sed命令的脚本,用于定义文本处理规则,可以是一个或多个命令组成。
input_file:要处理的输入文件。

command命令(简单用法)

a:新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c:取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d:删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i:插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p:打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s:取代,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 。
y:大小写转换,和s用法类似,但只能替换大小写
n:读取下一个输入行, 用下一个命令处理新的行
&:经常用来在原文本行中增加字符串。

常用用法:

  1. 替换文本:使用s命令可以替换文件中的文本。

    例如,将文件中的所有"old"替换为"new"可以使用命令

    s/old/new/:将第一个匹配到的"old"替换为"new"。
    s/old/new/g:将所有匹配到的"old"替换为"new"。
                                //此处可替换:g表示全局替换、i表示忽略大小写
                                
    实例:将文件中的"foo"替换为"bar":`sed 's/foo/bar/' file.txt
    
  2. 行首和行尾操作:

^:匹配行首。
$:匹配行尾。
实例:将文件中以"foo"开头的行删除:sed '/^foo/d' file.txt
  1. 删除行:使用d命令可以删除文件中的行。

    例如,删除包含特定文本的行可以使用命令

    语法:sed ‘/pattern/d’ file
    
    [root@localhost ~]# cat a     //删除第一行
    0.0.0.0
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    [root@localhost ~]# sed '1d' a
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    
    实例:删除文件中包含"foo"的行:
    sed '/foo/d' file.txt
    
    [root@localhost ~]# cat a   //删除以1开头的所有行
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    [root@localhost ~]# sed '/1/d' a    
    0.0.0.0
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    
    //表示删除所有空行
    [root@localhost ~]# sed '/^$/d' ab
    //删除以jw开头的行
    [root@localhost ~]# cat ab
    on the UNIX Operating System.
    first:second
    one:tow
    jwnjhdbhgqa
    [root@localhost ~]# sed '/^jw/d' ab
    on the UNIX Operating System.
    first:second
    one:tow
    
  2. 插入行:使用i命令可以在文件中插入新的行。

    例如,将新行插入到指定行号的下方可以使用命令

    语法:sed ‘5i new line’ file  
    
    i\text:在匹配到的行之前插入文本
    [root@localhost ~]# cat a
    0.0.0.0
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    [root@localhost ~]# sed '1i\     hello' a   //"\"表示让空格生效
         hello
    0.0.0.0
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    
    //在具体的某一行前面插入
    [root@localhost ~]# sed '/10.10.10.128/i\     hello' a
    0.0.0.0
         hello
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    
  3. 追加文本

    a\text:在匹配到的行之后追加文本。
    [root@localhost ~]# cat a     
    0.0.0.0
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    [root@localhost ~]# sed '1ahello world' a   //在第一行后面加hello world
    0.0.0.0
    hello world
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    
    //如果想让空格在查询到文本中显示
    [root@localhost ~]# cat a
    0.0.0.0
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    [root@localhost ~]# sed '1a\     hello' a       //加\可以显示出来
    0.0.0.0
         hello
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    
    //在指定某一行的后面插入
    [root@localhost ~]# sed '/10.10.10.128/a\     hello' a
    0.0.0.0
    10.10.10.128
         hello
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    
    //具体的匹配某一数字
    [root@localhost ~]# sed '/255/a\    hahaha' a
    0.0.0.0
    10.10.10.128
    255.255.255.255
        hahaha
    255.255.255.0
        hahaha
    255.255.0.0
        hahaha
    255.0.0.0
        hahaha
    1111.1111.1111.1111.1
    1e13                       //在每个以255开头的字段后面加
    
    //每一行后面都加
    [root@localhost ~]# sed -r 'a\    hahaha' a
    0.0.0.0
        hahaha
    10.10.10.128
        hahaha
    255.255.255.255
        hahaha
    255.255.255.0
        hahaha
    255.255.0.0
        hahaha
    255.0.0.0
        hahaha
    1111.1111.1111.1111.1
        hahaha
    1e13
        hahaha
    
    [root@localhost ~]# sed -r '/(255.)?/a\    hahaha' a 
    0.0.0.0
        hahaha
    10.10.10.128
        hahaha
    255.255.255.255
        hahaha
    255.255.255.0          //此处的(255.)?表示匹配到括号内的也可以匹配其他的任何东西
        hahaha
    255.255.0.0
        hahaha
    255.0.0.0
        hahaha
    1111.1111.1111.1111.1
        hahaha
    1e13
        hahaha
    
  4. 更改

    c:将一整行都替换掉
    //将第二行替换成hello
    [root@localhost ~]# cat a
    0.0.0.0
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    [root@localhost ~]# sed '2chello' a     
    0.0.0.0
    hello
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    //将2-4行替换成为hahaha
    [root@localhost ~]# cat a
    0.0.0.0
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    [root@localhost ~]# sed '2,4chahaha' a
    0.0.0.0
    hahaha
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    //将2-4行替换成为成两行
    [root@localhost ~]# sed '2,4cha\nhaha' a     //\n表示换行
    0.0.0.0
    ha
    haha
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    1e13
    //更改最后一行
    [root@localhost ~]# sed '$chahaha' a    //$表示最后一行
    0.0.0.0
    10.10.10.128
    255.255.255.255
    255.255.255.0
    255.255.0.0
    255.0.0.0
    1111.1111.1111.1111.1
    hahaha
    
  5. s:表示替换

    //&:用正则表达式的内容进行替换
    [root@localhost ~]# echo "hello huayu" | sed -r 's/hello (.*)/hehe &/g'
    hehe hello huayu
    //此处的&表示hello huayu   
    
    //此处的空格为tab键
    [root@localhost ~]# cat a
    0.0.0.0
    10.	10.10	.128
    255.255.255.255
    255.255.255.0
    255.0.0.0
    [root@localhost ~]# sed 's/\t/\
    > /2' a       //\t表示tab键 \表示换行 表示第二个tab键替换成换行
    0.0.0.0
    10.	10.10
    .128
    255.255.255.255
    255.255.255.0
    255.0.0.0
    //把10替换成换行
    [root@localhost ~]# sed 's/10/\
    /' a
    0.0.0.0
    
    .	10.10	.128
    255.255.255.255
    255.255.255.0
    255.0.0.0
    //在10后面换行
    [root@localhost ~]# sed 's/10/10\    //可以将\换成\n同样表示换行
    /' a                                     windows:换行\r\n
    0.0.0.0
    10
    .	10.10	.128
    255.255.255.255
    255.255.255.0
    255.0.0.0
    
    [root@localhost ~]# cat jj
    .Ah "Major Heading"
    [root@localhost ~]# sed '/.Ah/s/.Ah/@A HEAD =/' jj
    @A HEAD = "Major Heading"
    [root@localhost ~]# sed '/.Ah/s/.Ah/@A HEAD =/;s/"//g' jj
    @A HEAD = Major Heading         //;表示结束   g:表示所有
    

    \s表示匹配任意空白字符,包括空格、tab键、回车符、换行符等等

    [root@localhost ~]# sed 's/UNIX/\\s-2&\\s0/' ab
    on the \s-2UNIX\s0 Operating System.   //&在此处代替UNIX 
    

    颠倒:

    [root@localhost ~]# cat ab
    on the UNIX Operating System.
    first:second
    one:tow
    [root@localhost ~]# sed -r 's/(.*):(.*)/\2:\1/g' ab
    on the UNIX Operating System.
    second:first
    tow:one
    
  6. 转换:(大小写转换)

    语法:y/abcdefghijklmnopqrstuvwsyz/ABCDEFGHIJKLMNOPQRSTUVWSWZ
    [root@localhost ~]# cat ab
    on the UNIX Operating System.
    first:second
    one:tow
    jwnjhdbhgqa
    [root@localhost ~]# sed 'y/abcdefghijklmnopqrstuvwsyz/ABCDEFGHIGKLMNOPQRSTUVWSYZ/' ab
                                                       //将小写换成大写
    ON THE UNIX OPERATING SYSTEM.
    FIRST:SECOND
    ONE:TOW
    GWNGHDBHGQA
    
  7. 打印(正常的系统自带打印功能)

    p:表示打印
    [root@localhost ~]# cat ab
    on the UNIX Operating System.
    first:second
    one:tow
    jwnjhdbhgqa
    [root@localhost ~]# sed -n '/one/p' ab    //关闭默认答应功能 匹配这一行并打印
    one:tow
    
  8. 打印特定行:使用p命令可以打印文件中的特定行。

    例如,打印包含特定文本的行可以使用命令

    语法:sed -n ‘/pattern/p’ file              //-n关闭默认打印功能
    [root@localhost ~]# cat ab
    on the UNIX Operating System.
    first:second
    one:tow
    jwnjhdbhgqa
    [root@localhost ~]# sed -n '/one/p' ab    //关闭默认答应功能 匹配这一行并打印
    one:tow
    
    
  9. 批量编辑文件:使用-f选项可以将一系列sed命令保存在脚本文件中,并对多个文件进行批量编辑。

    例如,使用sed脚本文件对多个文件进行替换可以使用命令

    语法:sed -f scriptfile file1 file2 …
    
  10. 忽略大小写:

    i:在替换命令中,忽略大小写。
    实例:将文件中所有的"foo"替换为"bar",忽略大小写:
    sed 's/foo/bar/gi' file.txt
    
  11. 执行多个命令:

    -e:执行多个sed命令。
    实例:将文件中的"foo"替换为"bar",并删除以"test"开头的行:
    `sed -e 's/foo/bar/g' -e '/^test/d' file.txt`
    
  12. 保存修改结果:

    -i`:直接在原文件上进行修改(仅适用于GNU sed)。
    实例:将文件中的"foo"替换为"bar",并保存修改结果:sed -i 's/foo/bar/g' file.txt
    
  13. 多行删除

    d删除:(删除偶数行)
    D(会进行多次处理,将多个空行变成一个空行)
    删除指定行范围:sed '2,4d' file.txt
    这将删除文件file.txt中的第2至第4行。
    
    删除匹配模式的行:sed '/pattern/d' file.txt
    这将删除文件file.txt中包含模式"pattern"的所有行。
    
    删除空行:sed '/^$/d' file.txt
    这将删除文件file.txt中的所有空行。
    
    删除连续的重复行:sed '$!N; /^\(.*\)\n\1$/!P; D' file.txt
    
  14. 多行打印

    P(打印匹配到的一行)
    打印两行文本:sed -n 'N; p' file.txt
    这将读取文件file.txt的内容,并打印每两行。
    
    打印特定行范围内的文本:sed -n '3,6p' file.txt
    这将打印文件file.txt中第3行到第6行的内容。
    
    打印匹配特定模式的多行文本:sed -n '/pattern/,/pattern/p' file.txt
    这将打印文件file.txt中包含匹配模式的文本块。
    
    打印指定行号的文本:sed -n '5p' file.txt
    这将打印文件file.txt中的第5行。
    
    打印最后几行的文本:sed -n '$-2,$p' file.txt
    

    保持空间和模式空间

    当使用sed命令时,sed会将输入文件一行一行地读取到模式空间中,然后根据所提供的命令对模式空间中的内容进行处理。而保持空间是sed提供的一个临时存储区域,用于存储模式空间中的内容,以便在处理后的某些情况下进行访问和操作。

    模式空间:是sed命令默认使用的缓冲区,它存储着当前读取的文本行。当sed命令读取一行文本时,该行文本会被存储到模式空间中,并且可以对模式空间中的文本进行操作,如打印、替换等。模式空间的内容可以通过命令进行修改,也可以通过命令打印出来或输出到标准输出。

    保持空间:是一个额外的缓冲区,用于存储之前读取的文本行。通过一些特定的命令,可以将模式空间中的内容复制到保持空间中,或者将保持空间中的内容追加到模式空间中。保持空间的内容可以在后续的操作中使用,以实现一些需要多行数据处理的功能。

    1. 保持空间的读取和写入:
      • 读取保持空间内容到模式空间:h命令
      • 将模式空间内容写入保持空间:H命令
    2. 保持空间和模式空间的交换:
      • 将模式空间内容复制到保持空间,并清空模式空间:x命令
      • 将保持空间内容复制到模式空间,并清空保持空间:g命令
    3. 模式空间和保持空间的追加和附加:
      • 追加保持空间内容到模式空间:G命令
      • 附加模式空间内容到保持空间:a命令和i命令
    ^$:表示空行
    !:表否定
    H:将模式空间(教室)的东西放到保持空间(仓库)
    G:追加保持空间内容到模式空间
    x:将保持空间里面的东西与模式空间对调
    
  15. 分支

    在sed中,分支使用以下语法:
    [address]b [label]
    [address]t [label]
    [address]是一个可选的地址范围,用于指定应用分支的行。
    b命令用于无条件分支
    t命令用于条件分支
    [label]是一个标签,用于指定分支的目标位置。
    
    无条件分支(b命令):会导致sed跳转到指定的标签处,并继续执行后续的命令。例如:
    sed '2b label' file.txt
    上面的命令会从文件file.txt的第二行开始处理,当遇到b命令时,会跳转到标签label处。
    
    条件分支(t命令):会根据指定的条件进行判断,如果条件为真,则跳转到指定的标签处。例如:
    sed '/pattern/t label' file.txt
    上面的命令会在文件file.txt中查找匹配pattern的行,如果找到,则跳转到标签label处。
    

grep

取掩码:

[root@localhost ~]# cat a
0.0.0.0
10.10.10.128
255.255.255.255
255.255.255.0
255.255.0.0
255.0.0.0
1111.1111.1111.1111.1
1e13

[root@localhost ~]# grep -E '^([0-2][0-5]?[0-5]?\.){3}[0-2][0-5]?[0-5]?$' a
0.0.0.0
255.255.255.255
255.255.255.0
255.255.0.0
255.0.0.0     
进阶版:
[root@localhost ~]# grep -E '^([0-2]([0-5]?){2}\.){3}[0-2]([0-5]?){2}$' a
{2}表示对(0-5)?的重复两次          ?表示0次或者1次

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值