• shell编程 之 实践出真知(代码实例)


    1,在任意一个文件夹里,新建10个空文件,文件名为t1.txt -t10.txt ,文件内容分别是11-20 ,就一行,然后把这个10个文件命名成t1.sh-t10.sh。

    老司机版:

        $ for (( i=1;i<=10;i++ )) ;do p=`expr $i + 10 `;echo $p >>"t"${i}.txt; done    #创建加写入

        $ for fie in `ls *txt` ;do p=`basename $fie .txt` ;mv $fie ${p}.sh ;done     #重命名

    小菜鸟版:

        #!/bin/bash

        for i in {1..10}    #创建加写入

        do
            touch test$i.txt
            echo `expr $i + 10 `>test$i.txt
        done

        rename 's/txt/sh/' *    #重命名

    问题:

        sed和 rename这两个命令还挺深奥,改天总结一下。可参考:https://www.cnblogs.com/AloneSword/p/5072698.html

    sed命令:

            当下文件夹里有haha.sh,内容是:

    abc

    cdfa

    ghia

    jkla lm=abc

    mnoa

    pqr

    stu

    vwx

    yz

            基本格式:

                sed [options] 'command' file(s) ,比如:实例1 :sed ‘s/a/b/g' filename  注意,是单引号(大部分时候单双通用,但是少数情况单双不同,比如$).默认在输出中改,不在源文件中改

            基本参数:

                -n安静模式 ,不显示全文,只显示改动了的或者与命令有关的行,和p配合使用哦。p:打印指定行

                -i不只是在终端输出结果,同样修改结果到源文件中 这么用:sed -i ‘s/a/A/g' haha.sh

                -r用扩展正则表达式匹配,默认普通正则表达式,

                     sed -r "s/(lm=).*/1 bcd/g" haha.sh    相当于sed -r "s/lm=.*/lm=bcd/g" haha.sh,但是明显高端很多。比如下面这个:

          echo "wo he ni"|sed -r 's/(wo)(.*)(ni)/321/g'    sed里小括号的顺序默认是1,2,3,函数返回ni he wo 

                -e支持sed后有多项命令

                   sed -e "s/a/A/g;s/b/B/g" haha.sh    或者 sed -e "s/a/A/g"  -e "s/b/B/g" haha.sh 在文件中同时替换a和b,第一个例子可以不加-e。  

               -f指定执行filename文件中的命令,应该是有编译功能的

                   假设有个文件名字叫tmp,文件里内容是s/a/A/g;s/b/B/g,那么我们可以直接用tmp来替换

                   sed -f tmp haha.sh  在文件中同时替换a和b   

            sed中特有的命令:比如上一个实例1中的's' 和'g'

                 s  表示行内单词或者字母的替换:s类似于y轴,g类似于x轴,s定位行,g定位行内的第几个

                           sed 's/a/A/g' haha.sh    全文把a替换成A

                           sed '1s/a/A/g' haha.sh    只在第一行中把a替换成A,默认输出haha.sh的所有替换过的内容,加上-n以后,就是之输出改动过的内容,即改过的第一行

                           sed 's/a/A/2g' haha.sh   在所有的行中把每行第二个a变成A,

                           sed '1s/.*/AINI/g' haha.sh    把第一行整行内容替换成AINI,.*的意思是正则匹配所有字符。

                           sed " s/haha/${a}/g" haha.sh    把文本haha替换成变量a,变量a可以是自己赋值的,也可以是别的命令或者程序计算得来的。

                c  整行替换

                           sed 'c 123' haha.sh    默认是把所有的行都替换成123,不用管内容,(空格可以用斜杠替换)

                           sed '2c 123' haha.sh    把第二行改成123,别的不变。

               a  相当于add,添加一行内容到指定的行后边

                           sed 'a 123 456 789' haha.sh    默认把每一行的后面添加上123 456 789

                           sed '1a 123456' haha.sh    在第一行的后面添加一行123456

               p  打印指定行,通常与-n参数配合使用

                           sed -n 's/a/A/p' haha.sh    打印出所有执行了替换的行,注意,此处的p不可以用g替代。

                           sed -n '5p' haha.sh    打印出haha.sh的第五行

                           sed -n '2,5p' haha.sh    打印出haha.sh的2-5行

                           sed -n '/c.f/p' haha.sh    打印出符合正则c.f的所有匹配的行,注意,第一个斜杠是必须的

               d  删除指定行

                          sed '1,5d' haha.sh    删除haha.sh中的指定行

                          sed '/^s*$/d' haha.sh    删除空行

    rename命令

        基本格式:

            sed [options] 'commandfile 

        options:

             -v  显示成功重命名的文件  实例1:rename -v 's/suibian/abc/' *    suibian更名为abc,会附带提示:suibian renamed as abc

            -n  不是真的去改名,而是用做测试,该命令会把要改要改的文件打印出来    实例:rename -n 's/abc/suibian/' *    把abc变成suibian, 结果:rename(abc, suibian)

            -f 则表示会强制修改。

        rename中的替换命令

            基本和sed一样,常用s和g,另外,这俩命令最好只用单引号,单引号内部支持转义。

            实例:

            rename ’s/a/A/g‘  *   当前文件夹下所有文件名中带a的全替换成A。*表示所有文件。

            rename ‘s/a/A/’  *.txt    d当前文件夹下所有txt文件中,有a的都变成A,”g"可省。

            rename ‘s/$/S/' *    把所有文件的末尾添加一个S,rename 's/$/S/' *    把文件名的末尾是“$”符号的那个文件,改成文件末尾是S. 但是,如果改用双引号或者不加引号,不论是否添加了转移符号,结果都是在每个文件的末尾添加了S,可见rename还是多用单引号才好。

            rename -n 's/.sh//' *.sh    把所有.sh结尾的文件去掉后缀名.

            rename -n 's/[1]/number/' *.sh    把文件名中含有数字1的,其中的1替换成number

       常用的正则匹配格式

             x?  匹配 0 次或一次 x 字符串

             x*  匹配 0 次或多次 x 字符串,但匹配可能的最少次数
             x+  匹配 1 次或多次 x 字符串,但匹配可能的最少次数
             .*  匹配 0 次或一次的任何字符
            .+  匹配 1 次或多次的任何字符
             {m} 匹配刚好是 m 个 的指定字符串
             {m,n}匹配在 m个 以上 n个 以下 的指定字符串 
            []  匹配符合 [] 内的字符
            [^] 匹配不符合 [] 内的字符
             [0-9]匹配所有数字字符
             [a-z]匹配所有小写字母字母  
            ^   匹配某字符开头的字符
            $   匹配字符结尾的字符
            d  匹配一个数字的字符,和 [0-9] 语法一样
            d+  匹配多个数字字符串,和 [0-9]+ 语法一样 
            w   英文字母或数字的字符串,和 [a-zA-Z0-9] 语法一样
            W   非英文字母或数字的字符串,和 [^a-zA-Z0-9] 语法一样
            s    空格,和 [ f] 语法一样 
            a|b|c 匹配符合a字符 或是b字符 或是c字符 的字符串
     

            

        

                           

                           

                          

                        

                

        

  • 相关阅读:
    使用Hugo框架搭建博客的过程
    使用Hugo框架搭建博客的过程
    使用Hugo框架搭建博客的过程
    Windows软件包管理工具:Scoop
    Centos8 安装ifconfig(net-tools.x86_64)
    Centos8 重启网卡方法
    使用Visual Studio 2019--调试汇编32位代码的详细步骤
    linux 三剑客之awk总结
    linux 三剑客之sed常用总结
    mysql数据库的笔记
  • 原文地址:https://www.cnblogs.com/0-lingdu/p/9269115.html
Copyright © 2020-2023  润新知