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
  • 相关阅读:
    【Javascript】javascript学习 二十二 JavaScript 对象简介
    【Javascript】javascript学习 二十六 JavaScript Boolean(逻辑)对象
    【Javascript】javascript学习 二十九 JavaScript HTML DOM 对象
    【Javascript】javascript学习 二十八 JavaScript RegExp 对象
    【Javascript】javascript学习 二十一 JavaScript 指导方针
    【Javascript】javascript学习 二十三 JavaScript 字符串(String)对象
    【Javascript】javascript学习 三十 JavaScript 浏览器检测
    【Javascript】javascript学习 二十五 JavaScript Array(数组)对象
    【Javascript】javascript学习 二十四 JavaScript Date(日期)对象
    【Javascript】javascript学习 二十七 JavaScript Math(算数)对象
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10763001.html
Copyright © 2011-2022 走看看