这个有点麻烦,需要关联上下行的两个条件。

方法1:

大致思路如下:

按行读取文件,存入数组。

以循环方式按顺序处理数组中的数据。

循环内判断行是否已abc开头,如果是则将变量存入临时变量,并不做输出处理;如果不是abc开头则直接输出变量内容到文件,进入下次循环

再次循环时,判断上一行是否是abc开头,如果是再判断本次的变量结尾是否是def。

如果条件不满足则先输出上一次循环变量(在临时变量内。)到文件,在输出本次循环的变量,临时变量清空,进入下次循环

如果条件满足,则输出duoyu字串到文件两行。

代码如下:

#!/bin/bash
f1=2
f2=""
f3=""
f4=""
while read line 
   do
     echo $line
     if [ $f1 -eq 1 ]; then
        #preline header include abc
        f1=2
        f3=${line: -3}
       f3=${f3}x
       f4=""
        if [ $f3 == "defx" ]; then
          #line tail include def
           echo "duoyu\n" >> s3.txt
           echo "duoyu\n" >> s3.txt
        else
           echo $f2 >> s3.txt
           echo $line >> s3.txt
        fi
     else
       f4=${line:0:3}
       f4=x$f4
       if [ $f4 == "xabc" ]; then
          f2=$line
          f1=1
       else
          echo $line >>s3.txt
       fi
     fi
   done < s1.txt
echo $line
if [ $f1 -eq 1 ]; then
   echo $f2 >> s3.txt
   f2=""
   f1=2
fi
代码简略说明:

f4=${line:0:3}
       f4=x$f4

变量f4用于判断头部是否是abc,这里给头部加了一个字母x,为了避免刚好取得的3个字符是纯数字。

变量f3也是类似的思路。

-------------------------------------------------------

上面的代码理由漏洞。

第一个漏洞是对文件输入文件s1.txt和输出王文建s3.txt未做相应处理。

应该在头部先判断s1存在和不存在,并做处理。

对s3.txt直接清空即可。

第二个漏洞是在判断上一个循环变量头部包含abc,本次循环变量未包含def的情况,应对本次循环进行是否头部包含abc的检测,并做处理。

#!/bin/bash
> s3.txt
if [ -f s1.txt ]; then
   echo "starting..."
else
   echo "error!need s1.txt!"
   exit 1
fi
f1=2
f2=""
f3=""
f4=""
while read line 
   do
     echo $line
     if [ $f1 -eq 1 ]; then
        #preline header include abc
        f1=2
        f3=${line: -3}
       f3=${f3}x
       f4=""
        if [ $f3 == "defx" ]; then
          #line tail include def
           echo "duoyu\n" >> s3.txt
           echo "duoyu\n" >> s3.txt
        else
           echo $f2 >> s3.txt
           f4=${line:0:3}
           f4=x$f4
           if [ $f4 == "xabc" ]; then
              f2=$line
              f1=1
           else
              echo $line >>s3.txt
           fi
        fi
     else
       f4=${line:0:3}
       f4=x$f4
       if [ $f4 == "xabc" ]; then
          f2=$line
          f1=1
       else
          echo $line >>s3.txt
       fi
     fi
   done < s1.txt
echo $line
if [ $f1 -eq 1 ]; then
   echo $f2 >> s3.txt
   f2=""
   f1=2
fi

------------------------------

最后做点优化,有一部分代码是重复的,因此稍作调整可以避免重复代码。但是还要增加一个continue

#!/bin/bash
> s3.txt
if [ -f s1.txt ]; then
   echo "starting..."
else
   echo "error!need s1.txt!"
   exit 1
fi
f1=2
f2=""
f3=""
f4=""
while read line 
   do
     echo $line
     if [ $f1 -eq 1 ]; then
        #preline header include abc
        f1=2
        f3=${line: -3}
       f3=${f3}x
       f4=""
        if [ $f3 == "defx" ]; then
          #line tail include def
           echo "duoyu\n" >> s3.txt
           echo "duoyu\n" >> s3.txt
           continue;
        else
           echo $f2 >> s3.txt
        fi 
     fi
       f4=${line:0:3}
       f4=x$f4
       if [ $f4 == "xabc" ]; then
          f2=$line
          f1=1
       else
          echo $line >>s3.txt
       fi 
 done < s1.txt
echo $line
if [ $f1 -eq 1 ]; then
   echo $f2 >> s3.txt
   f2=""
   f1=2
fi

方法2:

这个用sed直接实现,方法来自某度

sed '/^abc/{N;/def$/s/.*/douyu/}' s1.txt

方法1和方法2相比方法2比较简洁但是存在瑕疵。如果文件出现如下格式,方法二识别不出来。

abc8888888
abceeeeeeedef

即一行既满足头部abc,也满足尾部def的情况方法2无法识别。

shell小技巧(五)把以abc开头的下一行以def结尾的两行替换成douyu相关推荐

  1. 6条shell小技巧,让脚本显得不再业余

    6条shell小技巧,让脚本显得不再业余 原创作者: 58沈剑 来自公众号:架构师之路 画外音:说实话,技术思路类文章(WHY, HOW),比技术实践类(WHAT)更难写. 如何能让自己的shell显 ...

  2. uwsgi怎么通过浏览器访问某个脚本_4个Shell小技巧帮你提高机器学习效率:写好脚本,事半功倍...

    晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在机器学习的实践过程中,用好Shell能帮你很多节省时间. 最近,有位来自ETHZ的学生分享了一些Shell小技巧.对程序员来说,这些技巧更 ...

  3. 4个Shell小技巧,帮你提高机器学习生产效率

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI 在机器学习的实践过程中,用好Shell能帮你很多节省时间. 最近,有位来自ETHZ的学生分享了一些Shell小技巧.对程序员来说,这些技巧 ...

  4. Linux Shell常用技巧(五)

    十一.  awk编程:    1.  变量:     在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串&qu ...

  5. Shell小技巧(一百一十贰)特殊字符“\”-转义小结

    在各种编程语言中,一般都存在使用特殊字符组合来表达特殊的含义.其中大部分都适用"\"作为转换字符含义的操作符. Shell中也使用"\",我们称其为转义. 在e ...

  6. Shell小技巧(一百零五)脚本中的空格小结

    1.通过空格可以实现同一行内给多个变量赋值 例如: var1=1   var2=2   var3=3 2.变量中含有空格时,可能输出结果大相径庭 例如: x="a b  c   d     ...

  7. shell小技巧(五十)打印100以内被3整除的数

    打印100以内被3整除的数 输出要求每行输出9个数,每行每列对齐 代码: #!/bin/bash #设定被除数是3 i=3 #设定一个变量记录行输出列的数量,等于10时换行,重置为1 j=1 whil ...

  8. shell小技巧(十五)模拟抓阄

    要求: 1.执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大机会越大,前面已经抓到的数字,下次不能在出现相同数字. 2.第一个输入名字后,屏幕输出信息,并将名字和数字记 ...

  9. linux shell gsub,[转载]Linux Shell常用技巧(五)-第二部分

    6. 数组:因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key).值和关键字都存储在内部的一张针对key/value应用hash的表格里.由于hash不是顺序存储,因此在显示数 ...

  10. shell小技巧(十一)打印下面这句话中字母数不大于6的单词

    打印下面这句话中字母数不大于6的单词. I am oldboy teacher welcome to oldboy training class. 方法1: #!/bin/bash word6=&qu ...

最新文章

  1. 两大顶级 AI 算法一起开源!Nature、Science 齐发 Alphafold2 相关重磅,双厨狂喜~...
  2. 一文读懂 RoIPooling、RoIAlign 和 RoIWarp
  3. FCGF-基于稀疏全卷积网络的点云特征描述子提取(ICCV2019)
  4. Android开发之通过CursorAdapter读取数据(源代码分享)
  5. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 )
  6. 从音乐到全“声”态,腾讯音乐发展的“中国范本”
  7. RNN和LSTM、GRU的简单理解
  8. 怎么用mysql存储系统数据库_mysql数据库之基本操作和存储引擎
  9. ELK日志分析平台.1-搭建
  10. 使用 jQuery Mobile 与 HTML5 开发 Web App (八) —— jQuery Mobile 工具栏
  11. 关于tensorflow2.0的弊端
  12. php中调用go代码,php中的goto的用法实例(代码)
  13. php中英文版切换最好的办法,php做项目进行中英文的切换,如何快速实现
  14. HTML快速上手教程
  15. 吉米多维奇数学分析习题集每日一题--习题1379
  16. linux 445端口关闭,windows关闭445端口
  17. H5小游戏框架总结推荐
  18. Java多线程 - 解析线程的5种/6种状态
  19. Xcode Message from debugger: Terminated due to memory issue
  20. 没拿到一毛钱股份的老公和CEO身份曝光,发文妻子的选妃照也被挖出来了……

热门文章

  1. mysql三表联查sql语句_mybatis中SQL语句的三表联查
  2. 猿编程 python_猿编程客户端下载_猿编程(小学阶段编程课程学习专用) 1.5.2 官方版_极速下载站...
  3. Unity3D中常用的物理学公式
  4. fps类游戏c语言源程序,95k的FPS游戏!用C++和汇编编写
  5. Win10笔记本不显示WiFi列表
  6. 【Oracle】ora-00932:数据类型不一致:应为 -,但却获得BLOB
  7. Garbled Circuits介绍 - 2 基础知识
  8. rust阿尔法辅助_和平精英阿尔法辅助器
  9. 无本经营?2021做电商跨境shopee平台赚钱很轻松!
  10. uni-app开始时间结束时间(结束时间大于开始时间)picker编写