• Linux三剑客之sed


    sed

      非交互式的编辑器,可以修改文件,也可以使用重定向来保存结果。

    具体过程

      首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模拟空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。Sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。

    定址

      决定对哪些行进行编辑,若没有,则对整个文件进行编辑。

    例如:

    sed –n ‘3p’ datafile
        表示只打印第三行($符号表示最后一行)
    Sed –n ‘100,200p’ datafile
        表示查看文件的第100行到第200行
    sed ‘2,5d’ datafile
        删除第二到第五行
    sed ‘/my/,/you/d’ datafile
        删除包含“my”的行到包含“you”的行之间的行
    Sed ‘/my/,10d’ datafile
        删除包含“my”的行到第十行的内容

    命令

    a    新增行,在匹配行后添加一行或多行。多行时除最后一行外,每行末尾需用“”续行
    c    替换行,用此符号后的文本替换匹配行中的文本,多行除最后一行用“”
    i    插入行,此字符后的文本插入到匹配行的上面
    d    删除行,删除匹配到的行
    p    打印行,将某些行输出。通常p会与参数-n一起使用,只输出匹配的行
    s    替换字符串

    选项

    -n    在sed的基本用法中,所有来自标准输出的信息都会被列出到终端上。加上-n参数后,则只有被sed处理的那些行才会被输出。
    -e    同时执行多个命令文本时才需要指定-e选项。
    -f    同时执行多个命令文本时,可将这些命令文本写到一个文本中,然后通过-f filename的方式使用。
    -i    直接修改读取的文档,而不是输出到终端

    实例:

    删除行

    sed ‘$d’ filename
        删除最后一行,显示其他行,文件本身不会发生改变
    sed ‘/my/d’ filename
        删除包含my的行,其余的都被显示
    sed –i ‘3d’ filename
        文件的第三行删除掉,什么也不显示,文件发生变化

    新增行

    sed ‘1a hello world’ filename
        在第一行下面新增一行,内容为hello world
    sed ‘$a hello world’ filename
        在最后一行下面新增一行,内容为hello world
    sed ‘1,3a hello world’ filename
        在第一行,第二行和第三行下面分别增加一行,内容为hello world
    sed ‘1a hello world
    hello world’ filename
        在第一行下面添加两行,内容都为hello world,多行使用换行符
    
    sed –e ‘1a xxx’ –e ‘2a yyy’ –e ‘3,5d’ filename
        -e选项用来指定命令文本,如果只有一个命令文本时可以省略,多个就要用-e

    插入行

    sed ‘1i hello world’ filename
        在第一行的上面插入一行,内容为hello world
    
    command.txt的内容:
    1i hello world
    2i hello girl
    3i hello boy
    sed –f command.txt filename
        当需要添加的行很多时,就不适合用-e了,这时把添加的行放到一个文本文件里,然后用-f来引用

    替换行

    sed ‘1c hello world’ filename
        把第一行替换为hello world
    sed ‘1,3c hello world’ filename
        把第一行到第三行替换为hello world,是把三行替换成一行

    替换字符串

    sed ‘s/hello/hi/’ filename
        把hello替换为hi,只有每一行的第一个hello被替换了
    sed ‘s/hello/hi/g’ filename
        把匹配到的所有hello都替换为hi
    sed ‘2,3s/hello/hi/g’ filename
        把第二行和第三行的所有hello替换为hi
    Sed ‘s/hello//g’ filename
        删除所有的hello

    定界符(默认/)

    echo ‘/home/nick/book’ | sed ‘s;/home/nick/;/home/jack/;’
    echo ‘/home/nick/book’ | sed ‘s#/home/nick/#/home/jack/#’
    sed –n ‘2,3s/hello/hi/gp’ filename
        将文件里第二行和第三行所有的hello改为hi,并打印出来
    sed ‘hello/p’ filename
        默认把所有输入行都打印到输出上,匹配到hello的行还要另外再打印出来
    sed –n ‘/hello/p’ filename
        打印出含有hello的行,-n取消了默认的打印
    sed –n ‘/hello/Ip’ filename
        默认的匹配是区分大小写的额,用大写字母I可以忽略大小写
    sed ‘/hello/d’ filename
        删除匹配行
    sed ‘/hello/a hello world’ filename
        在有hello的行下面添加hello world新行
    sed ‘/hello/s/world/worlds/g’ filename
        找到含有hello的行,将这些行的world全部换为worlds
    sed ‘1,20y/abcdq/wxyzg/’ filename
        将第一行到第二十行的所有a改为w,b改为x,…,也就是一对一方式转换

    正则

    /^my/    匹配所有以my开头的行
    /my$/    匹配所有以my结尾的行
    /m..y/    匹配包含字母m,后跟任意两个字符,再跟字母y的行
    /my*/    匹配包含字母m,后跟零个或多个y字母的行
    /[Mm]y/    匹配包含My或my的行
    /[^Mm]y/        匹配包含y,但y之前的那个字符不是M或m的行
    1,20s/(you)self/1r/    处理第一到第二十行,you被保存为标签1,若发现youself,则改为yourself
    s/my/**&*/    符号&代表查找串,my将被替换为**my*
    /<my/    匹配包含以my开头的单词的行
    /my>/    匹配包含以my结尾的单词的行
    /9{5}/    匹配包含连续5个9的行
    /9{5,}/    匹配包含至少连续5个9的行
    /9{5,7}/    匹配包含连续5到7个9的行
  • 相关阅读:
    洛谷[ZJOI2008]骑士(基环树二次DP法+树形DP)
    洛谷P5022 旅行(基环树+断环法)
    AtCoder Beginner Contest 174 ——D.Alter Altar(思维)
    洛谷P1972 [SDOI2009]HH的项链(离线+树状数组)
    CF1365D Solve The Maze (BFS)
    codeforces1426——F. Number of Subsequences(DP)
    codeforces1324——E.Sleeping Schedule(DP+初始化)
    codeforces319——B. Psychos in a Line(思维+单调栈)
    codeforces292——D. Connected Components(并查集+前缀和优化)
    codeforces1013——D. Chemical table(思维+转化+并查集)
  • 原文地址:https://www.cnblogs.com/chy-op/p/9751711.html
Copyright © 2020-2023  润新知