敞开成长之旅!这是我参与「日新计划 12 月更文挑战」的第8天,点击查看活动概况
学习shell的根底语法.忽然,就刚刚.想到一个小功用,怎样批量修正文件姓名.以及批量修正文件内容呢.基于这个好奇.也就诞生了这篇文章.记载一下自己的学习心得.
您能在这儿看到啥
- 怎样完成
- 落地计划
怎样完成
许多时分,咱们都会去直接找解决方法,忽略了考虑能力.反而大大的提升了查找能力.我更倾向于先考虑,然后再去查找.
关于批量修正这个问题,忽然让我想起了中华小当家里从前说过一句.假如在你手足无措的时分,就回到你的原点想一想️.好像是很有道理啊.我的原点.脑子忽然想到竟然是编译器.对啊.编译器就有这样的功用,如下所示
编译器的查找功用也是我经常用的啊,比如我想大局修正一个属性,就会用到查找,然后再替换,内容即可.对哦,这样不就直接便是我想要的吗.
- 获取文件途径
- 获取替换内容
- 找到包括替换内容的一切文件途径
- 轮询替换内容
从上面开始的整理.基本上现已满意我的需求.下面咱们来画一下流程图.这样就方便咱们履行落地计划了.
这仅仅咱们的开始计划.假如我想到更好的计划,也会同步更新.暂时咱们就先依照这个计划.去落地,说不定在不断的尝试中,就会有更好的计划.这也是我的经历,不怕累.由于笨,所以会不断的试错.
落地计划
- 准备测试数据.
在准备测试数据的时分,忽然就有了一个新的需求.由于,我是一个一个文件的创立,纯纯的手动创立.并且,这是一个枯燥无味的工作.然后我就想到,为啥我不运用shell脚本创立呢.这样也练练手了.所以下一篇我将会具体的记载一下批量操作.好了回归主题,下面便是我纯纯纯手动创立的测试文件.
每个文件里边的内容差异就在于shell字符的多少.由于咱们这儿算是测试,基于上面的流程图中的第一步和第二步.这儿就先不做处理.咱们先完成中心功用.然后再去丰富功用.
-
获取替换文件的途径
-
运用
find
和grep
组合获取文件途径通过# shell 通用指令之find这篇文章里,咱们现已知道,假如你想寻觅特定的后缀文件.咱们需要运用
find . -name "*.文件后缀"
,当然假如你想对文件进行内容读取,也是少不了获取文件权限的.哈哈,是不是之前学习的东西,都是有用的呢,下面咱们看一下代码# 第一步获取咱们想要的并且能够履行读写权限的文件 find . -name "*.txt" -print0 | while IFS= read -r -d '' file; do # 第二步便是筛选出,包括方针内容的文件 # 之前的文章也是学习了怎样判断指令履行是否成功判断 # 到这儿,咱们也是运用上了. if grep "shell" "$file"; then # 第三步,输出包括方针文件的具体信息. echo "$file" fi done
-
运用
grep
获取文件途径由于对grep仅仅会用,这儿我就直接上代码,后续也会好好学习一下.当然这代码也是我自己写的.
grep -rn "shell" . | while IFS= read -r file; do echo "$file" done
履行成果,如下所示
-
-
替换文件内容
经过上面的查找,剩下的便是替换了.在字符串操作这篇文章里.咱们知道,咱们是需要替换当前文件里符合要求的字符串.所以,这儿咱们运用的指令,如下所示.
语法:
${a/str1/str2}
终究代码如下所示
-
运用
find
和grep
组合获取文件途径find "$project_path" -name "*.txt" -print0 | while IFS= read -r -d '' file; do if grep "shell" "$file"; then sed -i "" "s/shell/tt/g" "$file" fi done
-
运用
grep
获取文件途径grep -rn "tt" . | while IFS= read -r file; do sed -i "" "s/tt/shell" "$file" done
这样就简单的完成了修正内容.
-
一些细节
在运用sed指令,发现了一个小细节,由于我的是mac电脑.我一开始运用的指令格式如下所示
sed -i "s/tt/shell" "$file"
然后就报错了.报错内容如下所示
# extra characters at the end of comman
查找了材料才知道.unix和linux在运用sed指令是有差异.需要在 -i
后边增加一个""
即可.
系列文章
-
shell 通用指令之find
-
shell 通用指令之ls
-
shell 通用指令之文件权限
-
shell 通用指令之流程控制(一)
-
shell 通用指令之流程控制(二)
-
# shell 通用指令之字符串操作
参考文章
sed报错