• Linux命令-sed


    一、简介

    sed 命令是通过流编辑的方式来处理和编辑文件的,也就是逐行读取并查找、处理(增、删、改…)数据。

    语法: sed [选项] [脚本命令] 文件名 或者 标准输出 | sed [选项] [脚本命令]

    常用选项:

    -n,                取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
    -i[扩展名]          直接修改文件(如果指定扩展名则备份文件),注意,,不加-i时默认只是预览,不会对文件做实际修改
    -h, --help         打印帮助并退出
    -V, --version      输出版本信息并退出
    
    • 1
    • 2
    • 3
    • 4

    脚本命令:

    脚本命令是编辑处理文件的主体,它包括行后添加、行前插入、行删除、字符(串)替换、读入写入文件、打印等功能,注意脚本命令需要用引号’'包括

    脚本命令说明
    a在符合匹配条件的行后追加内容,格式:'[address]a[appendstr]''[address]a\(回车后输入追加内容,可多行,以' filename结束输入)
    i在符合匹配条件的行前插入内容,格式:'[address]i[insertstr]''[address]a\(回车后输入插入内容,可多行,以' filename结束输入)
    c将符合匹配条件的行更改为指定内容,格式:'[address]c[changestr]''[address]a\(回车后输入更改内容,但多行测试失败,以' filename结束输入)
    d删除符合匹配条件的行,格式:'[address]d'
    s替换符合匹配条件的内容,格式:'[address]s/pattern/replacement/flags',flags用法见演示实例。
    y将instr对应的每一个字符替换成outstr对应的每一个字符,格式:'[address]y/instr/outstr/' ,注意instr与outstr长度必须相同。
    r在符合匹配条件的行后读入指定文件filename中的内容,格式:'[address]r filename'
    w将符合匹配条件的行写入到filename文件,格式:'[address]w filename'
    p打印符合匹配条件的内容,通常与-n选项和用,格式:'[address]p'
    =打印符合匹配条件的行的行号,格式:'[address]='

    查找或匹配范围

    注意到上面脚本命令格式中用到了address,它表示的是需要查找或匹配的范围,也就是从指定的范围内进行sed操作,address的语法格式有:

    不填                     # 匹配所有行
    n                       # 匹配第n行
    /pattern/               # 匹配符合/pattern/条件的行
    n,m                     # 匹配从第n行开始,到第m行结束
    n,+m                    # 匹配从第n行开始,到第n+m行结束
    /pattern/,n             # 匹配从符合/pattern/条件的行开始,到第n行结束
    /pattern1/,/pattern2/   # 匹配从符合/pattern1/条件的行开始,到符合/pattern2/条件的行结束
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    二、实例:

    首先查看一下需要操作的文件

    hollowman@hollowman-F117:~/testdir$ cat sed.txt
    ooo ooo ooo ooo ooo
    iii iii iii iii iii
    ooo ooo iii iii ooo
    iii iii ooo ooo iii
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.行后追加内容

    a 在符合匹配条件的行后追加内容,格式:'[address]a[appendstr]''[address]a\(回车后输入追加内容,可多行,以' filename结束输入)

    hollowman@hollowman-F117:~/testdir$ sed '2aiii' sed.txt    #在第2行后追加iii,注意,因为没有-i选项,并不实际追加,只是预览效果。
    ooo ooo ooo ooo ooo
    iii iii iii iii iii
    iii
    ooo ooo iii iii ooo
    iii iii ooo ooo iii
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2.行前插入内容

    i 在符合匹配条件的行前插入内容,格式:'[address]i[insertstr]''[address]a\(回车后输入插入内容,可多行,以' filename结束输入)

    hollowman@hollowman-F117:~/testdir$ sed '/ooo/iiii' sed.txt  #在包含ooo的行前插入iii
    iii
    ooo ooo ooo ooo ooo
    iii iii iii iii iii
    iii
    ooo ooo iii iii ooo
    iii
    iii iii ooo ooo iii
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.更改指定行内容

    c 将符合匹配条件的行更改为指定内容,格式:'[address]c[changestr]''[address]a\(回车后输入更改内容,但多行测试失败,以' filename结束输入)

    hollowman@hollowman-F117:~/testdir$ sed '/ooo/cxxx' sed.txt   #将包含ooo的行更改为XXX
    xxx
    iii iii iii iii iii
    xxx
    xxx
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.删除指定行

    d 删除符合匹配条件的行,格式:'[address]d'

    hollowman@hollowman-F117:~/testdir$ sed '2,$d' sed.txt    #删除第2行到最后一行
    ooo ooo ooo ooo ooo
    
    • 1
    • 2

    5.替换内容

    s 替换符合匹配条件的内容,格式:'[address]s/pattern/replacement/flags'

    flags用法:

    n : 数字,范围1-255,如果每行匹配出的内容有多次,则只替换第n次匹配的内容。
    g : 表示替换每行中所有匹配到的内容
    3g : 如果每行匹配出的内容有多次,则只从第三次匹配的内容开始替换。
    i : 表示匹配时忽略大小写

    替换内容replacement的两种特殊形式:

    & : 表示引用匹配内容,也就是引用pattern其本身的意思
    \n : 对于pattern可以设置子匹配内容,而\n则表示引用第几个匹配,子匹配用小括号()表示,不过放在pattern中时需要用\进行转义,也就是\(\) ,如/\(a\)\(b\)\(c\)/中有3个子字符串分别为a,b,c,而\1,\2,\3分别就表示替换时直接引用a,b,c

    hollowman@hollowman-F117:~/testdir$ sed 's/ooo/xxx/2' sed.txt       #查找每行的所有ooo,但只替换每行中的第二个ooo为xxx
    ooo xxx ooo ooo ooo
    iii iii iii iii iii
    ooo xxx iii iii ooo
    iii iii ooo xxx iii
    hollowman@hollowman-F117:~/testdir$ sed '2,$s/ooo/xxx/g' sed.txt    #从第2行开始至末尾,查找并替换每行中的所有ooo为xxx
    ooo ooo ooo ooo ooo
    iii iii iii iii iii
    xxx xxx iii iii xxx
    iii iii xxx xxx iii
    hollowman@hollowman-F117:~/testdir$ sed 's/two/five/2g' sed.txt    #查找每行的所有ooo,但只从第二个ooo开始替换成XXX
    ooo xxx xxx xxx xxx
    iii iii iii iii iii
    ooo xxx iii iii xxx
    iii iii ooo xxx iii
    hollowman@hollowman-F117:~/testdir$ sed 's/OOO/xxx/ig' sed.txt     #查找并替换每行的所有OOO(不区分大小写)为XXX
    xxx xxx xxx xxx xxx
    iii iii iii iii iii
    xxx xxx iii iii xxx
    iii iii xxx xxx iii
    hollowman@hollowman-F117:~/testdir$ sed 's/o../&s/g' sed.txt      #查找所有的以o开头并紧跟任意2个字符的字符串,并替换为其本身(用&表示)+s的新的字符串
    ooos ooos ooos ooos ooos
    iii iii iii iii iii
    ooos ooos iii iii ooos
    iii iii ooos ooos iii
    hollowman@hollowman-F117:~/testdir$ sed -i 's/\(i\)\(i\)\(i\)/\1a\2b\3c/' sed.txt  #查找每行的第一个iii,并替换为iaibic,这里的\1,\2,\3分别表示其本身的3个子字符串,每个子字符串用()表示,但注意这里的()需要用\来转义
    hollowman@hollowman-F117:~/testdir$ cat sed.txt
    ooo ooo ooo ooo ooo
    iaibic iii iii iii iii
    ooo ooo iaibic iii ooo
    iaibic iii ooo ooo iii
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    6.对多个不同的字符进行替换

    yinstr对应的每一个字符替换成outstr对应的每一个字符,格式:'[address]y/instr/outstr/' ,注意instr与outstr长度必须相同。

    hollowman@hollowman-F117:~/testdir$ sed 'y/abc/iii/' sed.txt   #查找所有的a,b,c字符,并分别替换为i,i,i
    ooo ooo ooo ooo ooo
    iiiiii iii iii iii iii
    ooo ooo iiiiii iii ooo
    iiiiii iii ooo ooo iii
    
    • 1
    • 2
    • 3
    • 4
    • 5

    7.在指定行后读入指定文件的内容

    r 在符合匹配条件的行后读入指定文件filename中的内容,格式:'[address]r filename'

    hollowman@hollowman-F117:~/testdir$ echo abc > read.txt
    hollowman@hollowman-F117:~/testdir$ cat read.txt 
    abc
    hollowman@hollowman-F117:~/testdir$ sed '/ooo/r read.txt' sed.txt   # 在包含ooo的行后读入read.txt文件的内容
    ooo ooo ooo ooo ooo
    abc
    iaibic iii iii iii iii
    ooo ooo iaibic iii ooo
    abc
    iaibic iii ooo ooo iii
    abc
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    8.符合条件的行写入指定文件

    w 将符合匹配条件的行写入到filename文件,格式:'[address]w filename'

    hollowman@hollowman-F117:~/testdir$ sed '/ooo/w read.txt' sed.txt   #将包含ooo的行写入read.txt文件,此命令会覆盖read.txt文件中原来的内容
    ooo ooo ooo ooo ooo
    iaibic iii iii iii iii
    ooo ooo iaibic iii ooo
    iaibic iii ooo ooo iii
    hollowman@hollowman-F117:~/testdir$ cat read.txt 
    ooo ooo ooo ooo ooo
    ooo ooo iaibic iii ooo
    iaibic iii ooo ooo iii
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    牛客SQL非技术快速入门题解
    Dest0g3 520迎新赛web
    为什么网络安全缺口很大,而招聘却很少?学网络安全真的没有前途吗?
    【浏览器内多个标签页之间的通讯、XSS和CSRF】
    Java方法中不使用的对象应该手动赋值为NULL吗?
    cv2.dnn.readNetFromONNX读取yolov8的onnx报错解决过程
    JVM调优参数
    Zemax操作41--公差优化(二)
    【python】 16进制字符串转list
    聊聊氮化硅(SiNx)在芯片中的重要性
  • 原文地址:https://blog.csdn.net/ymz641/article/details/126480885