zoukankan      html  css  js  c++  java
  • 正则三

    1) 系统的特殊符号

    常用符号   $ # ! |
    引号系列 "" '' ``($()) 
    没有引号: 可以直接识别通配符号 
    路径符号 . .. ~ -
    cd - == cd $OLDPWD
    [root@oldboy-xiaodao.com.cn tmp]# cd -
    /etc
    [root@oldboy-xiaodao.com.cn etc]# cd $OLDPWD
    [root@oldboy-xiaodao.com.cn tmp]# echo $OLDPWD
    /etc
    [root@oldboy-xiaodao.com.cn tmp]# cd $OLDPWD
    [root@oldboy-xiaodao.com.cn etc]# echo $OLDPWD
    /tmp

    逻辑符号 && ||
    定向符号 > >> 2> 2>> <(tr xargs) cat>>文件<<EOF
    2) 系统的通配符号(通配符号主要用于查找文件,根据文件名称)

    * {}

    3) 系统的正则符号(主要用于查找文件内容)

    基础正则 ^ $  ^$ . * .* (没有意义-有意义 有意义-没有意义 高级符号--变成普通)
    [1-9a-zA-Z] [^]
    扩展正则 + oldboy|oldgirl (oldboy) {}({n,m} {n} {n,} {,m}) ?

    01. 三剑客命令说明-sed命令

    sed - stream editor for filtering and transforming text
    可以进行文本编辑 文本过滤处理
    主要用于处理文本文件,对一些配置文件进行编辑修改

    02. sed命令使用方式 和 工作原理
    标准格式 sed [选项] [sed指令] [文件信息]
    举例说明 sed -i.bak 's#oldboy#oldgirl#g' oldboy.txt

    工作原理: 见图
    01. 按行进行过滤
    02. 将过滤出来的一行内容放入到模式空间中
    03. 会有默认输出(-n)
    04. 一行处理完会继续处理下一行

    03. sed命令使用方法
    环境准备:

    cat >person.txt<<EOF
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    EOF

    1) 查询信息
    单行查找内容
    根据字符内容进行过滤

    sed -n '/Alex/p' person.txt 
    103,Alex,COO

    根据行号信息进行过滤

    [root@oldboy-xiaodao.com.cn ~]# sed -n '3p' person.txt 
    103,Alex,COO
    [root@oldboy-xiaodao.com.cn ~]# sed -n '4p' person.txt 
    104,yy,CFO

    多行查找内容
    按照行号信息进行过滤

    [root@oldboy-xiaodao.com.cn ~]# sed -n '2,4p' person.txt 
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO

    按照内容信息进行过滤

    [root@oldboy-xiaodao.com.cn ~]# sed -n '/oldboy/,/yy/p' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO

    过滤不连续的多行信息(按照过滤的字符)

    sed -n '/Alex/p' person.txt 
    sed -n '/feixue/p' person.txt 
    sed -n '/Alex/p;/feixue/p' person.txt

    过滤不连续的多行信息(按照行号)

    sed -n '3p;6p' person.txt

    2) 增加信息

    echo oldboy >>/oldboy.txt 

    如何向文件指定行的后面增加信息

    [root@oldboy-xiaodao.com.cn ~]# sed '4a oldgirl' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    oldgirl
    105,feixue,CIO
    106,yy,CFO
    
    [root@oldboy-xiaodao.com.cn ~]# sed '/Alex/a oldgirl02' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    oldgirl02
    104,yy,CFO
    105,feixue,CIO
    106,yy,CFO
    
    [root@oldboy-xiaodao.com.cn ~]# sed '4a oldgirl01
    oldgirl02' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    oldgirl01
    oldgirl02
    105,feixue,CIO
    106,yy,CFO
    
    [root@oldboy-xiaodao.com.cn ~]# sed '$a oldgirl01
    oldgirl02' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    106,yy,CFO
    oldgirl01
    oldgirl02

    说明: $符号表示最后一行信息

    如何向文件指定行的前面增加信息

    [root@oldboy-xiaodao.com.cn ~]# sed '4a oldgirl01
    oldgirl02' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    oldgirl01
    oldgirl02
    105,feixue,CIO
    106,yy,CFO
    [root@oldboy-xiaodao.com.cn ~]# sed '4i oldgirl01
    oldgirl02' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    oldgirl01
    oldgirl02
    104,yy,CFO
    105,feixue,CIO
    106,yy,CFO

    3) 删除信息
    按照行号进行单行或多行删除

    [root@oldboy-xiaodao.com.cn ~]# sed '3,4d' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    105,feixue,CIO
    106,yy,CFO

    按照信息进行单行或多行删除

    [root@oldboy-xiaodao.com.cn ~]# sed -r '/Alex|feixue/d' person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    104,yy,CFO
    106,yy,CFO
    
    [root@oldboy-xiaodao.com.cn ~]# sed -n '/^$/!p' person.txt
    101,oldboy,CEO
    102,zhaoyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    106,yy,CFO

    说明: 利用!p表示对输出的内容信息进行取反

    真正对文件内容进行修改编辑 加上-i参数

    [root@oldboy-xiaodao.com.cn ~]# sed -ri.bak '/Alex|feixue/d' person.txt 
    [root@oldboy-xiaodao.com.cn ~]# cat person.txt 
    101,oldboy,CEO
    102,zhaoyao,CTO
    104,yy,CFO
    106,yy,CFO

    -i 参数使用注意事项
    01. -i参数一定编写在所有参数之后
    02. -i参数在使用使用一定不能和-n参数结合使用

    一种情况: -i参数写到所有参数的前面了

    sed -i.bakr '/Alex|feixue/d' person.txt 

    二种情况: -i参数会将屏蔽输出的信息放入到文件中

    [root@oldboy-xiaodao.com.cn ~]# sed -rn '7s#(.*=).*#1disabled#gp' /etc/selinux/config 
    SELINUX=disabled
    [root@oldboy-xiaodao.com.cn ~]# sed -rni.bak '7s#(.*=).*#1disabled#gp' /etc/selinux/config 
    [root@oldboy-xiaodao.com.cn ~]# cat /etc/selinux/config 
    SELINUX=disabled

    3) 修改信息
    单行进行整体修改
    多行进行整体修改

    [root@oldboy-xiaodao.com.cn ~]# sed -e '3c oldboy' -e '6c oldgirl' person.txt
    101,oldboy,CEO
    102,zhaoyao,CTO
    oldboy
    103,Alex,COO
    104,yy,CFO
    oldgirl
    105,feixue,CIO
    106,yy,CFO

    说明:
    c 表示多指定行进行整体修改
    -e 可以用于识别sed命令中的多个指令

    单行或多行进行部分内容修改
    根据内容进行修改调整:
    a 按照指定行进行修改调整

    sed '4s#Alex#goodman#g' person.txt
    sed '/103/s#Alex#goodman#g' person.txt

    b 利用正则符号进行匹配,再做调整(后向引用前向)

    [root@oldboy-xiaodao.com.cn ~]# echo 123456|sed -r 's#(..)(..)(..)#<1><2><3>#g'
    <12><34><56>
    [root@oldboy-xiaodao.com.cn ~]# echo 123456|sed -r 's#([0-9]{2})#<1>#g'
    <12><34><56>

    测验练习: 批量修改多个文件扩展名:
    touch oldboy{01..10}.jpg
    需要将oldboy01.jpg..oldboy10,jpg 所有文件扩展名改写为以png结尾
    利用sed命令进行批量
    提示:
    mv oldboy01.jpg oldboy01.png
    交给bash进行修改

    第一个历程: 将需要修改的文件进行查找过滤

    [root@oldboy-xiaodao.com.cn ~]# find /root/ -type f -name "oldboy*jpg"
    /root/oldboy01.jpg
    /root/oldboy02.jpg
    /root/oldboy03.jpg
    /root/oldboy04.jpg
    /root/oldboy06.jpg
    /root/oldboy07.jpg
    /root/oldboy09.jpg
    /root/oldboy10.jpg
    /root/oldboy05.jpg
    /root/oldboy08.jpg

    第二个历程: 将上面命令执行的结果交给sed命令进行处理
    单行信息进行修改调整

    echo "/root/oldboy01.jpg"|sed -r 's#(.*)jpg#mv & 1png#g'

    多行信息进行修改调整

    [root@oldboy-xiaodao.com.cn ~]# find /root/ -type f -name "oldboy*jpg"|sed -r 's#(.*)jpg#mv & 1png#g'
    mv /root/oldboy01.jpg /root/oldboy01.png
    mv /root/oldboy02.jpg /root/oldboy02.png
    mv /root/oldboy03.jpg /root/oldboy03.png
    mv /root/oldboy04.jpg /root/oldboy04.png
    mv /root/oldboy06.jpg /root/oldboy06.png
    mv /root/oldboy07.jpg /root/oldboy07.png
    mv /root/oldboy09.jpg /root/oldboy09.png
    mv /root/oldboy10.jpg /root/oldboy10.png
    mv /root/oldboy05.jpg /root/oldboy05.png
    mv /root/oldboy08.jpg /root/oldboy08.png

    第三个历程: 将命令输出的信息进行执行

    [root@oldboy-xiaodao.com.cn ~]# echo "mv person.txt.bak person.txt.bak00" 
    mv person.txt.bak person.txt.bak00
    [root@oldboy-xiaodao.com.cn ~]# echo "mv person.txt.bak person.txt.bak00" |bash
    
    find /root/ -type f -name "oldboy*jpg"|sed -r 's#(.*)jpg#mv & 1png#g'|bash
    [root@oldboy-xiaodao.com.cn ~]# ll
    -rw-r--r-- 1 root root 0 Jan 21 11:28 oldboy01.png
    -rw-r--r-- 1 root root 0 Jan 21 11:28 oldboy02.png
    -rw-r--r-- 1 root root 0 Jan 21 11:28 oldboy03.png
    -rw-r--r-- 1 root root 0 Jan 21 11:28 oldboy04.png
    -rw-r--r-- 1 root root 0 Jan 21 11:28 oldboy05.png
    -rw-r--r-- 1 root root 0 Jan 21 11:28 oldboy06.png
    -rw-r--r-- 1 root root 0 Jan 21 11:28 oldboy07.png
    -rw-r--r-- 1 root root 0 Jan 21 11:28 oldboy08.png
    -rw-r--r-- 1 root root 0 Jan 21 11:28 oldboy09.png
    -rw-r--r-- 1 root root 0 Jan 21 11:28 oldboy10.png

    标准解法:
    批量修改文件名称的命令: rename
    rename [options] expression replacement file...

    rename '将文件内容什么做修改' '修改成什么' 要修改的文件信息
    rename 'png' 'jpg' oldboy*png

    利用变量信息进行修改替换文件内容

    [root@oldboy-xiaodao.com.cn ~]# info=oldboy
    [root@oldboy-xiaodao.com.cn ~]# echo oldboy|sed 's#$info#oldgirl#g'
    oldboy
    [root@oldboy-xiaodao.com.cn ~]# echo oldboy|sed "s#$info#oldgirl#g"
    oldgirl

    作业:
    01. 批量创建用户(不需使用for循环脚本)
    a 批量创建10个用户 useradd oldboy{01..10}
    b 给每个用户设置密码
    c 需要设置随机密码 随机6位密码
    d 随机密码和用户对应关系信息要保存在一个文件中
    oldboy01 xasdas
    oldboy02 asda9a
    e 以上需求利用一条命令完成
    useradd passwd sed touch | bash echo 变量 >>

  • 相关阅读:
    鲜牛奶与纯牛奶的区别 All In One
    Rough Notation Animation All In One
    java基础编程String及相关
    JDBC1
    java基础数据类型
    java基础编程
    JDBC3
    MYSQL1
    JDBC2
    JSP和Servlet的相同点和不同点,他们之间的联系
  • 原文地址:https://www.cnblogs.com/nshgo/p/12158722.html
Copyright © 2011-2022 走看看