zoukankan      html  css  js  c++  java
  • linux shell 修改文本 sed

    linux shell 修改文本
    echo

    [root@DSI tmp]# echo 'yhqt1 test1' > test1.txt
    [root@DSI tmp]# cat test1.txt 
    yhqt1 test1
    [root@DSI tmp]# echo 'yhqt2 test2' > test1.txt
    [root@DSI tmp]# cat test1.txt 
    yhqt2 test2
    [root@DSI tmp]# echo 'yhqt1 test1' >> test1.txt ##追加
    [root@DSI tmp]# cat test1.txt 
    yhqt2 test2
    yhqt1 test1

    ##增加文本

    [root@DSI tmp]# cat >> test1.txt << EOF
    export HISTTIMEFORMAT='%F %T '
    EOF

    sed

    [root@DSI tmp]# sed -i '$a test3' test1.txt ##$最后一行,a是新增
    [root@DSI tmp]# cat test1.txt 
    yhqt2 test2
    yhqt1 test1
    test3
    [root@DSI tmp]# sed '/yhqt1/a	est4' test1.txt ##在yhqt1 行后面增加一行test4
    yhqt2 test2
    yhqt1 test1
    test4
    test3
    [root@DSI tmp]# sed '/yhqt1/a	est5
    test6' test1.txt ##在yhqt1 行后面增加2行
    yhqt2 test2
    yhqt1 test1
    test5
    test6
    test3
    [root@DSI tmp]# sed '/yhqt1/i	est7' test1.txt  ##在yhqt1行前面增加一行test7
    yhqt2 test2
    test7
    yhqt1 test1
    test3
    [root@DSI tmp]# cat test1.txt 
    yhqt2 test2
    test7
    yhqt1 test1
    test5
    test6
    test4
    test3
    test7
    [root@DSI tmp]# sed -i '/test7/a1111' test1.txt ##存在多行test7的情况,每个匹配的地方都会新增一行1111数据
    [root@DSI tmp]# cat test1.txt 
    yhqt2 test2
    test7
    1111
    yhqt1 test1
    test5
    test6
    test4
    test3
    test7
    1111
    ##如果只向第二个test7后面增加一行,可以先获取第二个test7的行号,然后根据此行号在后面增加一行数据
    ##获取行号
    [root@DSI tmp]# cat -n test1.txt |grep test7 |awk ' {print $1}'|sed -n "2"p
    9
    [root@DSI tmp]# sed -n '/test7/=' test1.txt |sed -n "2"p
    9
    [root@DSI tmp]# sed -e '9a2222' test1.txt 
    yhqt2 test2
    test7
    1111
    yhqt1 test1
    test5
    test6
    test4
    test3
    test7
    2222
    1111
    [root@DSI tmp]# sed 's/test5/& yhq1314/g' test1.txt  ##在指定行test5后面增加数据yhq1314
    yhqt2 test2
    test7
    1111
    yhqt1 test1
    test5 yhq1314
    test6
    test4
    test3
    test7
    1111
    [root@DSI tmp]# sed -i 's|test2|test222|' test1.txt  ##对字符串进行替换test2替换为test222
    [root@DSI tmp]# cat test1.txt 
    yhqt2 test222
    test7
    1111
    yhqt1 test1
    test5 yhq1314
    test6
    test4
    test3
    test7
    1111
    [root@DSI tmp]# sed -i '$a yhq,abc1,3456' test1.txt 
    [root@DSI tmp]# cat test1.txt 
    yhqt2 test222
    test7
    1111
    yhqt1 test1
    test5 yhq1314
    test6
    test4
    test3
    test7
    1111
    yhq,abc1,3456
    [root@DSI tmp]# sed -i 's|,|*|' test1.txt ##替换特殊字符
    [root@DSI tmp]# cat test1.txt 
    yhqt2 test222
    test7
    1111
    yhqt1 test1
    test5 yhq1314
    test6
    test4
    test3
    test7
    1111
    yhq*abc1,3456

    sed是stream editor(流编辑器)的缩写,是文本处理中非常重要的工具,配合正则表达式进行使用功能更强大。
    sed可以替换给定文本中的字符串,可以利用正则表达式进行匹配

    $ sed 's/pattern/replace_string/' file

    或者

    $ cat file |sed 's/patter/replaces_string/' file

    使用 -i选项,可以将替换结果应用于原文件,很多在进行替换之后,借助重定向来保存文件

    $ sed 's/text/replace/' file > newfile
    $ mv newfile file

    其实就是一个命令
    $ sed -i 's/text/replace/' file
    如果需要替换每一行中满足条件的内容,加参数g
    $ sed 's/pattern/replace_string/g' file
    后缀/g意味着sed会替换每一处匹配,如果需要从N+1开始匹配,加参数N

    [root@DSI tmp]# echo this thisthisthis | sed 's/this/THIS/2g'
    this THISTHISTHIS
    [root@DSI tmp]# echo this thisthisthis | sed 's/this/THIS/3g'
    this thisTHISTHIS
    [root@DSI tmp]# echo this thisthisthis | sed 's/this/THIS/4g'
    this thisthisTHIS

    #当需要从第N出匹配开始替换时,可以使用/Ng
    字符/在sed中作为定界符使用。可以像下面一样
    sed 's:text:replace:g'
    sed 's|text|replace|g'
    当定界符出现在样式内部时,必须使用前缀对它进行转义
    sed 's|te|xt|replace|g'
    |是一个出现在样式内部并经过转义的定界符

    1 移除空白行

    $ sed '/^$/d' file ##/pattern/d会移除匹配样式的行,在空白行中,行尾标记紧随着行首标记
    [root@DSI tmp]# cat test1.txt 
    yhqt2 test222
    test7
    1111
    yhqt1 test1
    test5 yhq1314
    test6
    test4
    test3
    test7
    1111
    
    yhq*abc1,3456
      xxx 
    
    [root@DSI tmp]# sed -i '/^$/d' test1.txt 
    [root@DSI tmp]# cat test1.txt 
    yhqt2 test222
    test7
    1111
    yhqt1 test1
    test5 yhq1314
    test6
    test4
    test3
    test7
    1111
    yhq*abc1,3456
      xxx 

    2 已匹配字符串标记&
    在sed中,用&标记匹配样式的字符串,就能够在替换字符串时使用已匹配的内容

    [root@DSI tmp]# echo this is an example | sed 's/w+/[&]/g'
    [this] [is] [an] [example]
    ##正则表达式w+ 匹配每一个单词,然后用[&]替换它,&对应于之前所匹配到的单词

    3 子串匹配标记1
    &代表匹配给定样式的字符串,但也可以匹配给定样式的其中一部分

    [root@DSI tmp]# echo this is digit 7 in a number | sed 's/digit ([0-9])/1/'
    this is 7 in a number
    ##这个命令将digit 7替换为7.样式中匹配到的子串是7,(pattern)用于匹配子串,模式被包括在使用斜线转义过的()中,对于匹配到的第一个子串,
    其对应的标记是1,匹配到的第二个子串是2,往后依次类推
    [root@DSI tmp]# echo seven EIGHT | sed 's/([a-z]+) ([A-Z]+)/2 1/'
    EIGHT seven
    ##([a-z])+)匹配第一个单词,([A-Z]+)匹配第二个单词,1,2用来引用他们,这种引用称为向后引用,在替换部分,他们的次序被更改
    为21,因此结果就是逆序

    4 组合多个表达式
    sed 'expression' | sed 'expression'
    等价于
    $ sed 'expression; expression'
    5 引用
    sed表达式通常用单引号来引用。也可以使用双引号。双引号会通过对表达式求值来对其进行扩展

    [root@DSI tmp]# text=hello
    [root@DSI tmp]# echo hello world | sed "s/$text/HELLO/" ##$text的求值结果是hello
    HELLO world
  • 相关阅读:
    Office相关
    Eclipse常用设置
    Google logos 纪念电吉他大师莱斯·保罗(LesPaul)演示
    强烈推荐SQL Prompt 3.8,并发布SQL Prompt 3.8 ,SQL Refator 的xxx
    C#命令行编辑器csc.exe
    JSP中文乱码问题 页面经过过滤器后得到的是中文,但插入到MYSQL数据库却成了“?”为什么?
    (转贴)来谈谈SQL数据库中"简单的"SELECT TOP—可能有你从未注意到的细节
    C#Winform限制Textbox只能输入数字
    VPC2007虚拟机与主机的互连互通方法
    邮件会消亡是无稽之谈
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10763001.html
Copyright © 2011-2022 走看看