当前位置: 首页 > Linux

Zsh开发指南(第14章:读写文件)

时间:2023-04-06 03:21:22 Linux

简介在阅读之前,我们偶尔会接触到读写文件的方法。本文将系统的讲一下读写文件的各种方法。写文件写文件比读文件简单。最常见的用法是使用>将命令的输出直接重定向到文件。如果文件存在,内容将被覆盖;如果该文件不存在,它将被创建。%echoabc>test.txt如果不想覆盖之前的文件内容,可以追加:%echoabc>>test.txt如果文件存在,则追加内容;如果该文件不存在,也会创建它。创建文件有时候我们只想先创建一个文件,等以后需要的时候再写入。touch命令用于创建一个文件(普通文件):%touchtest1.txttest2.txt#或者使用echo输出重定向,效果和touch一样#加-n因为不加,echo会输出一个换行符%echo-n>>test1.txt>>test2.txt#或者使用输入重定向%>>test1.txt>>test2.txt>test2{1..1000}.txt#!/bin/zsh>>test3{1..1000}.txttest.txt#使用输入重定向%>test.txttest。txt可以直接把数组写入文件,每行一个元素:%array=(aabbcc)%print-l$array>test.txt如果想把一个固定的字符串写入文件,可以这样:#脚本中也是这样,第二行之后的行首>代表换行,非输入内容#<test.txt<aa>bb>ccdd>ee>EOF%cattest.txtaabbccddee用mapfile读写文件如果不喜欢用重定向符号,也可以用哈希表来操作文件。zsh有个zsh/mapfile模块,用起来很方便:%zmodloadzsh/mapfile#这会创建一个文件,写入内容,如果文件存在,会覆盖掉%mapfile[test.txt]="abcd"%cattest.txtabcd#判断文件是否存在%(($+mapfile[test.txt]))&&echogoodgood#读取文件%echo$mapfile[test.txt]abcd#删除文件%unset"mapfile[test.txt.txt]"#traversethefile%fori(${(k)mapfile}){>echo$i>}test1.txttest2.txt从文件中间开始写有时我们需要从文件中间开始写入(比如从第100个字符或第3行开始)继续写入,覆盖后面的内容。zsh并没有直接提供这样的方法,但是我们可以通过迂回的方式来实现,先用truncate命令截断文件,然后追加。如果需要保留文件后面的内容,可以在截断前读入(见下面读文件的例子),最后写回。%echo1234567890>test.txt#只保留前5个字符%truncate-s5test.txt%cattest.txt12345%echoabcde>>test.txt%cattest.txt12345abcdereadfilereadentirefilereadentirefile是easier:%str=$(echo$i>}test.txt#先读取所有内容%str=$(>test.txt#将文件的后半部分加回去%echo-n$str[6,-1]>>test.txt%cattest.txt12345abcde67890但是如果比较大,整个文件读不进去,可以用在循环中首先read-knum一次读取固定数量的字符,然后写入一个中间文件,然后截断原始文件并插入内容。最后,catintermediatefile>>originalfile追加原始内容的后半部分。另外,从文件中间写入或读取内容的场景可以使用dd命令实现,dd命令的用法可以自行搜索。小结本文详细介绍了各种读写文件的方法,基本可以涵盖常用的场景。本文不再更新,全系列文章更新维护在这里:github.com/goreliu/zshguideWindows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua等相关问题的付费解决方案,定价灵活,欢迎咨询,微信ly50247。