• 随堂练习 文本处理三剑客 sed


    sed正则表达式用法

    常用选项:

    -n :只显示匹配行,在一般情况所有的STDIN都会输出到屏幕上,加入 -n 后只会打印被 sed 特殊处理的行

    -r :扩展正则表达功能,没有该选项时正则表达式一些元字符要用反斜杠转义

    -e :多个动作,一个sed 命令里可以有多个筛选条件,每个条件前需要加 -e;筛选不是选交集,是符合任一条件即输出

    -i :直接修改文档读取的内容,不在屏幕上输出

    command要用单引号引起来,常用命令有:

    d 删除行

    p 打印行

    l 列出非打印字符

    s 用一个字符串替换另一个

    l 不区分大小写

    正则表达式特殊字符

    .  : 表示任何单个字符
    []  : 包含一个字符序列,表示匹配序列中其中一个字符
    -  : 出现在[]中,表示一个序列范围.如[a-z]表示26个小写的英文字母
    ^  : 出现在[]中,表示对序列去反。如[^a-z]表示匹配不是a-z的其他字符
    *  : 匹配某一个字符的0个或1个或多个实例
    ?  : 匹配某一个字符的0个或1个实例
    +  : 匹配某一个字符的1个或多个实例
    $  : 匹配行尾。如test$指匹配以test结尾的行
    ^  : 匹配行首。如^test指匹配以test开始的行
    < 或  : 匹配词首
    > 或  : 匹配词尾
    : 转移特殊字符,如果需要匹配上述特殊字符,用反斜杠转义

    sed总结

    sed命令
    a\  在当前行下面插入文本。
    i\  在当前行上面插入文本。
    c\  把选定的行改为新的文本。
    d  删除,删除选择的行。
    D  删除模板块的第一行。
    s  替换指定字符
    h  拷贝模板块的内容到内存中的缓冲区。
    H  追加模板块的内容到内存中的缓冲区。
    g  获得内存缓冲区的内容,并替代当前模板块中的文本。
    G  获得内存缓冲区的内容,并追加到当前模板块文本的后面。
    l  列表不能打印字符的清单。
    n  读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
    N  追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
    p  打印模板块的行。
    P (大写) 打印模板块的第一行。
    q  退出Sed。
    b  lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
    r file 从file中读行。
    t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
    T label  错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
    w file  写并追加模板块到file末尾。
    W file  写并追加模板块的第一行到file末尾。
    !  表示后面的命令对所有没有被选定的行发生作用。
    =  打印当前行号码。
    #  把注释扩展到下一个换行符以前。

    sed替换标记
    g  表示行内全面替换。
    p  表示打印行。
    w  表示把行写入一个文件。
    x  表示互换模板块中的文本和缓冲区中的文本。
    y  表示把一个字符翻译为另外的字符(但是不用于正则表达式)
    \1  子串匹配标记
    &  已匹配字符串标记

    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结尾的单词的行。
    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的行。

    范例:

    1,打印第五行

    sed -n '5p' test.txt

    2,打印第一行到第五行

    sed -n '1,5p' test.txt

    3,打印第一行到最后一行

    sed -n '1,$p' test.txt

    4,打印包含root字符串的行

    sed -n '/root/p' test.txt

    5,打印以 g 开头的行

    sed -n '/^g/p' test.txt

    6,打印以 in 结尾的行

    sed -n '/in$/p' test.txt

    7,打印包含“r..t”字符串的行,两个点表示两个任一字符

    sed -n '/r..t/p' test.txt

    8,打印包含一个以上o的行,星号表示大于等于零个前字符

    sed -n 'oo*p' test.txt

    9,打印第一行和包含long的行

    sed -n -e '1p' -e '/long/p' test.txt

    10,删除第一行

    sed '1d' test.txt

    11,删除第一行到三行

    sed '1,3d' test.txt

    12,删除包含oot字符的行

    sed '/oot/d' test.txt

    13,第一到第二行的ot替换为to,与vim 中替换命令类似

    sed '1,2s/ot/to/g' test.txt

    14,与上一条命令类似,可以将斜杠换成@号,也可以换成#

    sed 's@ot@to@g' test.txt

    15,删除数字

    sed 's/[0-9]//g' test.txt

    16,删除字母

    sed 's/[a-zA-Z]//g' test.txt

    17,圆括号为一个整体,替换三个括号内容的顺序,123代表三个括号

    sed -r 's/(rot)(.*)(bash)/321/' test.txt

    18,在行前面加上123。也可以像上面用1来表示前面的整体,不过要用圆括号扩起来

    sed 's/^.*$/123&/' test.txt

    19,ot替换为to,并修改文本。没有-i的话以上所有操作只是标准输出的屏幕,不会修改文本

    sed -i 's/ot/to/g' test.txt

    20,删除 test.txt 中所有特殊字符(除了数字以及大小写字母)

    sed 's/[^0-9a-zA-Z]//g' test.txt

    21,在 test.txt 30行到末行最前面加‘aaa’

    sed 's/^.*$/&aaa/' test.txt

    22,表示以 # 号开头的行不显示

    sed -n '/^#/!p' fstab

    23,表示第2行,第6行删除

    sed -e '2d;6d' test.txt

    24,表示第2到第6行都删除

    sed -e '2,6d' test.txt

    25,表示把word加在含有hello后一行  默认是在后面一行追加

    sed '/hello/aword' test.txt

    26,表示把含有hello的行替换为hello world  ,这里g是全文替换,注意前面有s

    sed 's/hello/hello world/g' test.txt

    27,表示在含有hello后面一行追加world westos,其中world westos在一行

    sed '/hello/aworld weisha' test.txt

    28,表示在含有hello 后面一行追加 world westos,但是有 表示换行

    sed '/hello/aworld weisha' test.txt

    29,在所有行的前面一行添加行号

    sed '=' fstab

    30,给每一行行首添加行号

    sed '=' fstab | sed 'N;s/ //g'

    31,从包含adm到包行sync的行里面,全文替换nologin为weisha

    sed -e '/adm/,/sync/s@nologin@weisha@g' passwd

    32,从包含adm到包行sync的行里面,全文替换nologin为wei,全文替换sbin为leo ;表示衔接多个操作

    sed -e '/adm/,/sync/s/nologin/wei/g;s/sbin/leo/g' passwd

    33,删除文件每行的第一个字符

    sed -r 's/^.//g' passwd

    34,删除每行开头的所有空格

    sed -r 's/^ //g' passwd

    35,只显示每行的一个单词

    sed -r 's/([^0-9a-Z]+)(.+)//' g passwd

    36,找出 /etc/rc.d/init.d/functions 文件中所有的函数名称,名称包含 _ 和 ()

    sed -nr 's@(.*()) {@1@p' /etc/rc.d/init.d/functions

    37,替换一个文件/etc/passwd里的这root❌0:0:root:/root:/bin/bash一行第二个root为test?

    sed -ri '/^root/s/root/test/2' /etc/passwd

    38,sed将文件test中第50行中的haiwao改为haiwai?

    sed -ri '50s/haiwao/haiwai/' test

  • 相关阅读:
    8.用户注销
    7.用户登陆,用户退出,记住用户名和密码
    6.后台验证码-session作用域
    5.验证用户名是否已经被注册:AJAXC请求
    4.前端注册表单验证 && 表单回填
    3.注册后台处理逻辑编写
    HTTP Status 500
    jquery之stop()的用法
    angular.forEach
    jquery如何获取第一个或最后一个子元素?
  • 原文地址:https://www.cnblogs.com/xuanlv-0413/p/13193689.html
Copyright © 2020-2023  润新知