敞开成长之旅!这是我参与「日新计划 12 月更文挑战」的第8天,点击查看活动概况

学习shell的根底语法.忽然,就刚刚.想到一个小功用,怎样批量修正文件姓名.以及批量修正文件内容呢.基于这个好奇.也就诞生了这篇文章.记载一下自己的学习心得.

您能在这儿看到啥

  1. 怎样完成
  2. 落地计划

怎样完成

许多时分,咱们都会去直接找解决方法,忽略了考虑能力.反而大大的提升了查找能力.我更倾向于先考虑,然后再去查找.

关于批量修正这个问题,忽然让我想起了中华小当家里从前说过一句.假如在你手足无措的时分,就回到你的原点想一想️.好像是很有道理啊.我的原点.脑子忽然想到竟然是编译器.对啊.编译器就有这样的功用,如下所示

shell之批量修改内容

编译器查找功用也是我经常用的啊,比如我想大局修正一个属性,就会用到查找,然后再替换,内容即可.对哦,这样不就直接便是我想要的吗.

  1. 获取文件途径
  2. 获取替换内容
  3. 找到包括替换内容的一切文件途径
  4. 轮询替换内容

从上面开始的整理.基本上现已满意我的需求.下面咱们来画一下流程图.这样就方便咱们履行落地计划了.

shell之批量修改内容

这仅仅咱们的开始计划.假如我想到更好的计划,也会同步更新.暂时咱们就先依照这个计划.去落地,说不定在不断的尝试中,就会有更好的计划.这也是我的经历,不怕累.由于笨,所以会不断的试错.

落地计划

  1. 准备测试数据.

在准备测试数据的时分,忽然就有了一个新的需求.由于,我是一个一个文件的创立,纯纯的手动创立.并且,这是一个枯燥无味的工作.然后我就想到,为啥我不运用shell脚本创立呢.这样也练练手了.所以下一篇我将会具体的记载一下批量操作.好了回归主题,下面便是我纯纯纯手动创立的测试文件.

shell之批量修改内容

shell之批量修改内容

每个文件里边的内容差异就在于shell字符的多少.由于咱们这儿算是测试,基于上面的流程图中的第一步第二步.这儿就先不做处理.咱们先完成中心功用.然后再去丰富功用.

  1. 获取替换文件的途径

    • 运用findgrep组合获取文件途径

      通过# 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
      

    履行成果,如下所示

    shell之批量修改内容

  2. 替换文件内容

    经过上面的查找,剩下的便是替换了.在字符串操作这篇文章里.咱们知道,咱们是需要替换当前文件里符合要求的字符串.所以,这儿咱们运用的指令,如下所示.

    语法: ${a/str1/str2}

    终究代码如下所示

    • 运用findgrep组合获取文件途径

          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

查找了材料才知道.unixlinux在运用sed指令是有差异.需要在 -i后边增加一个""即可.

系列文章

  • shell 通用指令之find

  • shell 通用指令之ls

  • shell 通用指令之文件权限

  • shell 通用指令之流程控制(一)

  • shell 通用指令之流程控制(二)

  • # shell 通用指令之字符串操作

参考文章

sed报错