zoukankan      html  css  js  c++  java
  • Shell脚本实现对文件编辑


    常见Linux文件的编辑命令 vi/vim,有时候我们想写一个脚本实现对文件编辑,这个时候,可能就不够用了,下面介绍一些办法

    1、echo命令

    Shell的echo命令常用于字符串的输出

    例如:

    [root@mdw zxy]# echo 'Hello World !' > file1
    [root@mdw zxy]# cat file1
    Hello World !

    [root@mdw zxy]# echo 'Good Luck' > file1
    [root@mdw zxy]# cat file1
    Good Luck
    [root@mdw zxy]#
    >>追加
    [root@mdw zxy]# echo 'Hello World !' >> file1              
    [root@mdw zxy]# cat file1                    
    Good Luck

    Hello World !

    2、sed命令

    sed命令是一个面向字符流的非交互式编辑器,sed是按行来处理文本内容的。在shell中,使用sed来批量修改文本内容是非常方便的。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

    2.1 使用sed把aaa添加到文件file1中

    [root@mdw zxy]# sed -i '$a aaaa' file1
    [root@mdw zxy]# cat file1              
    Good Luck
    Hello World !

    aaaa

    其中$代表最后一行,a是新增





    #如果知道行号可以用下面的方法
    sed -i '88 r b.file' a.file   #在a.txt的第88行插入文件b.txt
    awk '1;NR==88{system("cat b.file")}'a.file > a.file
     
    #如果不知道行号,可以用正則匹配
    sed -i '/regex/ r b.txt' a.txt # regex是正则表达式
    awk '/target/{system("cat b.file")}'a.file > c.file
     
    #sed的話如果不改变源文件,可以去掉-i开关,修改会输出到STDOUT


    原文件:
    [root@xiaowu shell]# cat -n file
         1  aaaa
         2  bbbb
         3  cccc
         4  dddd

    现在要在第二行即“bbbb”行的下面添加一行,内容为“xiaowu”
    [root@xiaowu shell]# sed '/bbbb/axiaowu' file
    aaaa
    bbbb
    xiaowu
    cccc
    dddd

    如果要加两行“xiaowu”可以用一下语句,注意用“ ”换行
    [root@xiaowu shell]# sed '/bbbb/axiaowu xiaowu' file
    aaaa
    bbbb
    xiaowu
    xiaowu
    cccc
    dddd

    如果要在第二行即“bbbb”行的上添加一行,内容为“xiaowu”,可以把参数“a”换成“i”
    [root@xiaowu shell]# sed '/b/ixiaowu' file
    aaaa
    xiaowu
    bbbb
    cccc
    dddd

    以上文件中只有一行匹配,如果文件中有两行或者多行匹配,结果有是如何呢?

    [root@xiaowu shell]# cat -n file
         1  aaaa
         2  bbbb
         3  cccc
         4  bbbb
         5  dddd

    [root@xiaowu shell]# sed '/bbbb/axiaowu' file
    aaaa
    bbbb
    xiaowu
    cccc
    bbbb
    xiaowu
    dddd

    由结果可知,每个匹配行的下一行都会被添加“xiaowu”

    那么如果指向在第二个“bbbb”的下一行添加内容“xiaowu”,该如何操作呢?
    可以考虑先获取第二个“bbbb”行的行号,然后根据行号在此行的下一行添加“xiaowu”

    获取第二个“bbbb”行的行号的方法:
    方法一:
    [root@xiaowu shell]# cat -n file |grep b |awk '{print $1}'|sed -n "2"p
    4
    方法二:
    [root@xiaowu shell]# sed -n '/bbbb/=' file |sed -n "2"p
    4
    由结果可知第二个“bbbb”行的行号为4,然后再在第四行的前或后添加相应的内容:
    [root@xiaowu shell]# sed -e '4axiaowu' file
    aaaa
    bbbb
    cccc
    bbbb
    xiaowu
    dddd
    [root@xiaowu shell]# sed -e '4axiaowu xiaowu' file
    aaaa
    bbbb
    cccc
    bbbb
    xiaowu
    xiaowu
    dddd


    向指定行的末尾添加指定内容,比如在“ccccc”行的行尾介绍“ eeeee”

    [root@xiaowu shell]# cat file
    aaaaa
    bbbbb
    ccccc
    ddddd
    [root@xiaowu shell]# sed 's/cc.*/& eeeee/g' file
    aaaaa
    bbbbb
    ccccc eeeee
    ddddd



    2.2 使用sed命令对文件中的字符替换

    例如:

    [root@mdw zxy]# sed -i 's|aaaa|bbbb|' file1
    [root@mdw zxy]# cat file1                  
    Good Luck
    Hello World !

    bbbb

    2.3特殊字符的替换

    [root@mdw zxy]# echo 'Hello,world!!!' >>file1
    [root@mdw zxy]# sed -i 's|,|*|' file1        
    [root@mdw zxy]# cat file1                    
    Good Luck
    Hello World !
    bbbb
    Hello*world!!!
    [root@mdw zxy]#

  • 相关阅读:
    Android开发--Layout元素
    Android开发--RelativeLayout的应用
    group by调优的一些测试
    mysql explain中key_len的计算
    mysql索引长度的一些限制
    order by调优的一些测试
    metadata lock
    JDBC连接数据库
    Java—Map.Entry
    innodb buffer pool
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/12069324.html
Copyright © 2011-2022 走看看