• sed用法


    sed介绍

       sed处理文本文件时,首先会被读到末世空间中,而不会修改原文件。sed可以对文本文件的所有进行操作,也可以通过正则表达式进行匹配,使得sed可以只处理模式空间中的被正则表达式匹配到行。

        然后再判断模式空间中的文本是否会被正则表达式匹配到,如果匹配到,就会对匹配到的文本做编辑操作,之后再将被编辑的文本和没被编辑的文本一同输出到标准输出。

        如果模式空间没有被正则表达式匹配到,直接将没有被匹配到文本原样输出至标准输出。

    • 1:用法格式
    1: sed [选项] 脚本 文件

    2:脚本组成:
    地址定界
    编辑命令

    3: 常用的选项
    -n:不输出模式模式中的内容至屏幕,也就是不会将没有匹配到的文本输出到标准输出,只是输出编辑到的文本

    -e 脚本:可以指定多个脚本,实现多次编辑

    -f 脚本文件: 每一行一个编辑命令

    -i:直接修改原文件

    -r: 表示使用扩展的正则表达式
    • 2:地址定界
    地址定界(与vim的末行模式类似)
    1)全文匹配:不需要给定地址,表示全文匹配,而vim需要给定%表示全文匹配
    2)单地址匹配:写一个数字即可,例如:8表示匹配第8行
    3)多地址匹配:给定一个范围,
    例如:1,9 表示匹配第1行到第9行
    例如:1,+2 表示匹配第一行到第三行
    4)模式匹配:
    例如:/正则表达式/ 表示正则表达式匹配到的行
    例如:1,/正则表达式/ 表示从第一行到正则表达式匹配到的行
    5)步长匹配
    例如:1~2 表示所有奇数行
    例如:2~2 表示所有偶数行
    • 3:编辑命令
    编辑命令 (与vim的末行模式类似)d命令是特例,需要特别注意,不能加-n选项     
    (1) d: 删除,对应d命令来说,不要安装sed的工作机制去理解,原因是对应d命令而言,没有匹配到的文本是不会输出到标准输出的。例如:下面的sed对yhy文件进行处理,不会将没有匹配到文本的输出至标准输出,而是将编辑后的文本输出到标准输出
    例如:
    [root@7 ~]# cat yhy
    111
    222
    333
    444
    [root@7 ~]# sed '1,3d' yhy
    444
    [root@7 ~]# sed '/^#/d' /etc/fstab # 删除/etc/fstab文件中以#开头的行

    UUID=396430ca-28ec-4c44-8e8e-171c92800306 / xfs defaults 0 0
    UUID=8e454dca-4ea4-416b-8234-0b0a4570ad6e /boot xfs defaults 0 0
    UUID=64654a8f-23bc-45e6-8c9c-fbdc07538547 swap swap defaults 0 0

    2)p: 打印
    # 一定要-n选项,如果不加-n那么打印的行将会显示两遍
    [root@7 ~]# sed -n '3,4p' /etc/fstab
    # /etc/fstab
    # Created by anaconda on Mon Feb 6 21:08:54 2017

    3)a字符串:在行后面追加字符串,支持使用 实现多行追加
    例如:sed '5a ew_line' /etc/fstab:表示在第五行后面,也就是第六行插入new_line字符串,其后的行一次向下移动

    4)i字符串:在行前面插入字符串,支持使用 实现多行插入
    例如:sed '5i ew_line' /etc/fstab :表示在第5行插入new_line字符串,其后的行一次向下移动

    5)c字符串:把匹配到的行替换为字符串
    例如:sed '3cyhy' /etc/fstab 将第三行替换为yhy字符串

    6)w 文件路径:将匹配到的行重定向至指定的文件中
    例如:sed '/^[^#]/w yhy.txt' /etc/fstab 将非井号开头的行保存至yes.txt文件中

    7)r 文件路径:读取指定文件的内容插入到当前文件被匹配到的行处
    例如: sed '3r /etc/issue' /etc/fstab 将/etc/issue中的内容插入到第3行的文本后面

    8)=:表示被模式匹配到的行上面加上一个行号
    sed '/^UUID/=' /etc/fstab

    9)!:取反条件
    例如:sed '/^#/!d' /etc/fstab 将不是以#好开头的行删除

    10)s///:查找替换,常用的有s@@@, s### ,
    修饰符有:
    g:全局替换,表示可以替换一行中多次匹配到的字符串。如果不加g,那么只能替换一行中第一次出现的字符串
    w 文件路径:替换成功的结果保存至指定文件中
    p :显示替换成功的行







    (三)sed练习

    前言:sed操作文本的时候,基于经验来看,如果使用的编辑命令是p,那么需要加上-n选项,表示取消默认的输出,其他的编辑命令都不要加-n选项

    • 1:删除/etc/grub2.cfg文件中所有的以空白字符开头的行的行首的所有空白字符
    sed 's/^[[:space:]]+//' /etc/grub2.cfg
    • 2:删除/etc/fstab文件中所有以#开头的行的行首的#号且紧跟#号后面的所有空白字符
    sed -r 's/^#[[:space:]]*//' /etc/fstab
    • 3:输出一个绝对路径给sed命令,取出其文件名
     echo "/var/log/messages" | sed -r 's#^.*/(.*)#1#'  正确
    echo "/var/log/messages" | sed -r 's/^.*/(.*)/1/' 错误
    echo "/var/log/messages" | sed 's/^.*/(.*)/1/' 正确, 不用扩展正则表达式
    • 4:输出一个绝对路径给sed命令,取出其目录名,相当于dirname
     echo "/var/log/messasdfasdf/" | sed -r 's#(.*)/.*#1#'
  • 相关阅读:
    053403
    053402
    053401
    053400
    053399
    053398
    053397
    053396
    053395
    第k小数
  • 原文地址:https://www.cnblogs.com/liu1026/p/7661899.html
Copyright © 2020-2023  润新知