zoukankan      html  css  js  c++  java
  • linux sed 命令 实现对文件的增删改替换查 实验

    1. 统一实验文本

    # 创建包含下面内容的文件,后面的操作都会使用这个文件

    [root@MongoDB ~]# cat person.txt 
    101,mike,CEO
    102,jack,CTO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO

     

    2. 增删改查

    2.1 增

    • a 追加文本到指定行后
    • i 插入文本到指定行前

    2a 追加到第二行后面

    [root@MongoDB ~]# sed '2a 106,ben,CSO' person.txt 
    101,mike,CEO
    102,jack,CTO
    106,ben,CSO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO

    2i 把内容 插入到第二行前面

    [root@MongoDB ~]# sed '2i 106,ben,CSO' person.txt 
    101,mike,CEO
    106,ben,CSO
    102,jack,CTO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO
    2.1.2 多行增加

    换行符 不加 的话 都在一行显示

    [root@MongoDB ~]# sed '2a 106,ben,CSO
    107,peter,CCO' person.txt 
    101,mike,CEO
    102,jack,CTO
    106,ben,CSO
    107,peter,CCO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO

    第二种方法:

    后面加 接上输入文本内容

    [root@MongoDB ~]# sed '2a 106,ben,CSO 
    > 107,peter,CCO' person.txt
    101,mike,CEO
    102,jack,CTO
    106,ben,CSO 
    107,peter,CCO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO
    企业案例1:优化SSH配置(一键完成增加若干参数)

    在我们学习系统优化时,有一个优化点:更改ssh服务远程登录的配置。主要的操作是在ssh的配置文件加入下面5行文本

    Port 52113
    PermitRootLogin no
    PermitEmptyPasswords no
    UseDNS no
    GSSAPIAuthentication no

    我们可以使用vi命令编辑这个文本,但这样就比较麻烦,现在想一条命令增加5行文本到第13行前?

    [root@MongoDB ~]# sed  '13i Port 52113
    PermitRootLogin no
    PermitEmptyPasswords no
    UseDNS no
    GSSAPIAuthentication no' /etc/ssh/sshd_config 

    2.2 删

    d 删除指定的行

    不指定行,就删除所有行,所以没有结果

    [root@MongoDB ~]# sed 'd' person.txt

    删除文本第二行

    [root@MongoDB ~]# sed '2d' person.txt 
    101,mike,CEO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO

    把文本 第二行到第5行内容删掉

    [root@MongoDB ~]# sed '2,5d' person.txt 
    101,mike,CEO

    把文本的 第二行以上到结尾的行都删掉

    [root@MongoDB ~]# sed '2,$d' person.txt 
    101,mike,CEO

    删除文本第二行,第三行

    [root@MongoDB ~]# sed '2,3d' person.txt 
    101,mike,CEO
    104,feixue,CIO
    105,tom,COO

    删除文本奇数行,留下偶数行

    [root@MongoDB ~]# sed '1~2d' person.txt 
    102,jack,CTO
    104,feixue,CIO

    把文本 第二行到  2+2=4 第四行删掉  2-4 删掉

    [root@MongoDB ~]# sed '2,+2d' person.txt 
    101,mike,CEO
    105,tom,COO

    匹配有jack字符串那行 删除掉

    [root@MongoDB ~]# sed '/jack/d' person.txt 
    101,mike,CEO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO

    匹配有jack字符串和yy字符串的行 删除掉

    [root@MongoDB ~]# sed '/jack/,/yy/d' person.txt 
    101,mike,CEO
    104,feixue,CIO
    105,tom,COO

    把有jack字符串的行,和第三行删掉

    [root@MongoDB ~]# sed '/jack/,3d' person.txt 
    101,mike,CEO
    104,feixue,CIO
    105,tom,COO

     改

    2.3.1 按行替换

    c 用新行取代旧行

    2c 把输入的文本 替换第二行文本

    [root@MongoDB ~]# sed '2c 106,benson,CSO' person.txt 
    101,mike,CEO
    106,benson,CSO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO
    文本替换

    s:单独使用→将每一行中第一处匹配的字符串进行替换 ==>sed命令 
    g:每一行进行全部替换 ==>sed命令s的替换标志之一,非sed命令 
    -i:修改文件内容 ==>sed软件的选项

    sed软件替换模型(方框▇被替换成三角▲)

    sed -i 's/▇/▲/g' test.log 
    sed -i 's#▇#▲#g' test.log

     

    s要和g配合使用

    观察特点

    1. 两边是引号,引号里面的两边分别为sg,中间是三个一样的字符/#作为定界符。#能在替换内容包含/有助于区别。定界符可以是任意符号如:|等,但当替换内容包含定界符时,需转义即: |。经过长期实践,建议大家使用#作为定界符。
    2. 定界符/#,第一个和第二个之间的就是被替换的内容,第二个和第三个之间的就是替换后的内容。
    3. s#▇#▲#g,▇能用正则表达式,但▲不能用,必须是具体的。
    4. 默认sed软件是对模式空间(内存中的数据)操作,而-i选项会更改磁盘上的文件内容。
    [root@MongoDB ~]# sed 's/jack/ben/g' person.txt 
    101,mike,CEO
    102,ben,CTO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO

    -i 修改文件内容

    [root@MongoDB ~]# sed -i 's/jack/ben/g' person.txt 
    [root@MongoDB ~]# cat person.txt 
    101,mike,CEO
    102,ben,CTO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO
    企业案例3:指定行修改配置文件

    指定行精确修改配置文件,这样可以防止修改多了地方

    [root@MongoDB ~]# sed '3s#0#9#' person.txt 
    101,mike,CEO
    102,jack,CTO
    193,yy,CFO
    104,feixue,CIO
    105,tom,COO
    变量替换

    再新建一个文本

    [root@MongoDB ~]# cat test.txt 
    a
    b
    a

    赋值

    [root@MongoDB ~]# x=a
    [root@MongoDB ~]# y=b
    [root@MongoDB ~]# echo $x $y
    a b

    把文本里所有a字符串替换成b

    没有引号,用的就是双引号

    [root@MongoDB ~]# sed s#$x#$y#g test.txt 
    b
    b
    b

    单引号,没有变量置换功能,所见所得,是什么输出什么

    [root@MongoDB ~]# sed 's#$x#$y#g' test.txt 
    a
    b
    a

    双引号

    [root@MongoDB ~]# sed "s#$x#$y#g" test.txt 
    b
    b
    b
    分组替换( )1的使用说明

    sed软件的( )的功能可以记住正则表达式的一部分,其中,1为第一个记住的模式即第一个小括号中的匹配内容,2第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。 

    例:

    echo My name is  mike,I am 13 years old. 如果想保留这一行的单词mike,删除剩下的部分,使用圆括号标记想保留的部分
    [root@MongoDB ~]# echo My name is  mike,I am 13 years old. |sed 's#^.*is ([a-z].*),.*$#1#g'
    mike

    -r 支持正则表达式 , 不需要 加

    [root@MongoDB ~]# echo My name is  mike,I am 13 years old. |sed -r 's#^.*is ([a-z].*),.*$#1#g'
    mike

    ()是扩展正则表达式的元字符,sed软件默认识别基本正则表达式,想要使用扩展正则需要使用转义,即()。sed使用-r选项则可以识别扩展正则表达式,此时使用()反而会出错

    特殊符号&代表被替换的内容

    &等于被替换的内容 0 ,把1到3行的0改成 100

    [root@MongoDB ~]# sed '1,3s/0/10&/' person.txt 
    11001,mike,CEO
    11002,jack,CTO
    11003,yy,CFO
    104,feixue,CIO
    105,tom,COO
    企业案例5:批量重命名文件

    当前目录下有文件如下所示:

    [root@MongoDB ~]# mkdir -p /test/
    [root@MongoDB ~]# cd /test/ ; touch stu_102999_{1..5}_finished.jpg
    [root@MongoDB test]# ls
    stu_102999_1_finished.jpg  stu_102999_3_finished.jpg  stu_102999_5_finished.jpg
    stu_102999_2_finished.jpg  stu_102999_4_finished.jpg

    要求用sed命令重命名,效果为stu_102999_1_finished.jpg==>stu_102999_1.jpg,即删除文件名的_finished

    [root@MongoDB test]# ls| sed  's#^(.*).finished(.*)#mv & 12#g'
    mv stu_102999_1_finished.jpg stu_102999_1.jpg
    mv stu_102999_2_finished.jpg stu_102999_2.jpg
    mv stu_102999_3_finished.jpg stu_102999_3.jpg
    mv stu_102999_4_finished.jpg stu_102999_4.jpg
    mv stu_102999_5_finished.jpg stu_102999_5.jpg
    [root@MongoDB test]# 
    [root@MongoDB test]# 
    [root@MongoDB test]# ls| sed  's#^(.*).finished(.*)#mv & 12#g'|bash
    [root@MongoDB test]# ls
    stu_102999_1.jpg  stu_102999_2.jpg  stu_102999_3.jpg  stu_102999_4.jpg  stu_102999_5.jpg

     查

    p 输出指定内容,但默认会输出2次匹配的结果,因此使用n取消默认输出

    p要和 -n 配合使用

    按行查询

    打印文本第二行 

    也可以这样写 sed -n '2'p 

    [root@MongoDB ~]# sed -n '2p' person.txt 
    102,jack,CTO

    打印文本第二行,第三行

    说明:取行就用sed,最简单

    [root@MongoDB ~]# sed -n '2,3p' person.txt 
    102,jack,CTO
    103,yy,CFO

    打印奇数行

    [root@MongoDB ~]# sed -n '1~2p' person.txt 
    101,mike,CEO
    103,yy,CFO
    105,tom,COO

    把所有行打印, sed -n ''p person.txt

    或者

    [root@MongoDB ~]# sed -n 'p' person.txt 
    101,mike,CEO
    102,jack,CTO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO
    
    [root@MongoDB ~]# sed -n ''p person.txt 
    101,mike,CEO
    102,jack,CTO
    103,yy,CFO
    104,feixue,CIO
    105,tom,COO
    按字符串查询

    打印 匹配对应字符串的行

    打印jack的行

    [root@MongoDB ~]# sed -n '/jack/p' person.txt 
    102,jack,CTO

    打印jack字符串 到 feixue字符串的行 

    [root@MongoDB ~]# sed -n '/jack/,/feixue/p' person.txt 
    102,jack,CTO
    103,yy,CFO
    104,feixue,CIO
    混合查询

    打印第二行到 feixue那行 

    [root@MongoDB ~]# sed -n '2,/feixue/p' person.txt 
    102,jack,CTO
    103,yy,CFO
    104,feixue,CIO

    如何只用一个sed取出第2和第4行??? 

    [root@MongoDB ~]# sed -n '2p;4p' person.txt 
    102,jack,CTO
    104,feixue,CIO

    如何在sed中使用变量,两种方法

    第一

    在sed条件中是不认识变量取值的

    sed '/$x/d' test

    所以要想它能够识别变量

    sed "/$x/d/" test

    方法简单就是把"单引号"变成"双引号"

  • 相关阅读:
    APIO2019游记
    ZJOI2019赛季回顾
    「HNOI 2019」白兔之舞
    LOJ #6539 奇妙数论题
    BZOJ4314 倍数?倍数!
    伯努利数学习笔记&&Luogu P3711 仓鼠的数学题
    BZOJ 5093[Lydsy1711月赛]图的价值 线性做法
    AtCoder Grand Contest 030题解
    Codeforces Round #542 (Div. 1) 题解
    Codeforces Round #541 (Div. 2)题解
  • 原文地址:https://www.cnblogs.com/mingerlcm/p/10988254.html
Copyright © 2011-2022 走看看