shell小技巧(五)把以abc开头的下一行以def结尾的两行替换成douyu
这个有点麻烦,需要关联上下行的两个条件。
方法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相关推荐
- 6条shell小技巧,让脚本显得不再业余
6条shell小技巧,让脚本显得不再业余 原创作者: 58沈剑 来自公众号:架构师之路 画外音:说实话,技术思路类文章(WHY, HOW),比技术实践类(WHAT)更难写. 如何能让自己的shell显 ...
- uwsgi怎么通过浏览器访问某个脚本_4个Shell小技巧帮你提高机器学习效率:写好脚本,事半功倍...
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在机器学习的实践过程中,用好Shell能帮你很多节省时间. 最近,有位来自ETHZ的学生分享了一些Shell小技巧.对程序员来说,这些技巧更 ...
- 4个Shell小技巧,帮你提高机器学习生产效率
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 在机器学习的实践过程中,用好Shell能帮你很多节省时间. 最近,有位来自ETHZ的学生分享了一些Shell小技巧.对程序员来说,这些技巧 ...
- Linux Shell常用技巧(五)
十一. awk编程: 1. 变量: 在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义.变量的类型可以是数字.字符串.根据使用的不同,未初始化变量的值为0或空白字符串&qu ...
- Shell小技巧(一百一十贰)特殊字符“\”-转义小结
在各种编程语言中,一般都存在使用特殊字符组合来表达特殊的含义.其中大部分都适用"\"作为转换字符含义的操作符. Shell中也使用"\",我们称其为转义. 在e ...
- Shell小技巧(一百零五)脚本中的空格小结
1.通过空格可以实现同一行内给多个变量赋值 例如: var1=1 var2=2 var3=3 2.变量中含有空格时,可能输出结果大相径庭 例如: x="a b c d ...
- shell小技巧(五十)打印100以内被3整除的数
打印100以内被3整除的数 输出要求每行输出9个数,每行每列对齐 代码: #!/bin/bash #设定被除数是3 i=3 #设定一个变量记录行输出列的数量,等于10时换行,重置为1 j=1 whil ...
- shell小技巧(十五)模拟抓阄
要求: 1.执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大机会越大,前面已经抓到的数字,下次不能在出现相同数字. 2.第一个输入名字后,屏幕输出信息,并将名字和数字记 ...
- linux shell gsub,[转载]Linux Shell常用技巧(五)-第二部分
6. 数组:因为awk中数组的下标可以是数字和字母,数组的下标通常被称为关键字(key).值和关键字都存储在内部的一张针对key/value应用hash的表格里.由于hash不是顺序存储,因此在显示数 ...
- shell小技巧(十一)打印下面这句话中字母数不大于6的单词
打印下面这句话中字母数不大于6的单词. I am oldboy teacher welcome to oldboy training class. 方法1: #!/bin/bash word6=&qu ...
最新文章
- 两大顶级 AI 算法一起开源!Nature、Science 齐发 Alphafold2 相关重磅,双厨狂喜~...
- 一文读懂 RoIPooling、RoIAlign 和 RoIWarp
- FCGF-基于稀疏全卷积网络的点云特征描述子提取(ICCV2019)
- Android开发之通过CursorAdapter读取数据(源代码分享)
- 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 )
- 从音乐到全“声”态,腾讯音乐发展的“中国范本”
- RNN和LSTM、GRU的简单理解
- 怎么用mysql存储系统数据库_mysql数据库之基本操作和存储引擎
- ELK日志分析平台.1-搭建
- 使用 jQuery Mobile 与 HTML5 开发 Web App (八) —— jQuery Mobile 工具栏
- 关于tensorflow2.0的弊端
- php中调用go代码,php中的goto的用法实例(代码)
- php中英文版切换最好的办法,php做项目进行中英文的切换,如何快速实现
- HTML快速上手教程
- 吉米多维奇数学分析习题集每日一题--习题1379
- linux 445端口关闭,windows关闭445端口
- H5小游戏框架总结推荐
- Java多线程 - 解析线程的5种/6种状态
- Xcode Message from debugger: Terminated due to memory issue
- 没拿到一毛钱股份的老公和CEO身份曝光,发文妻子的选妃照也被挖出来了……
热门文章
- mysql三表联查sql语句_mybatis中SQL语句的三表联查
- 猿编程 python_猿编程客户端下载_猿编程(小学阶段编程课程学习专用) 1.5.2 官方版_极速下载站...
- Unity3D中常用的物理学公式
- fps类游戏c语言源程序,95k的FPS游戏!用C++和汇编编写
- Win10笔记本不显示WiFi列表
- 【Oracle】ora-00932:数据类型不一致:应为 -,但却获得BLOB
- Garbled Circuits介绍 - 2 基础知识
- rust阿尔法辅助_和平精英阿尔法辅助器
- 无本经营?2021做电商跨境shopee平台赚钱很轻松!
- uni-app开始时间结束时间(结束时间大于开始时间)picker编写