我们每天操作文件、处理文件,对文件有深刻地理解。而文件由一行一行的内容构成,却对行理解较少,仅有的常规理解是:
文件由零至多行构成;行由不同字符构成。
本文梳理行的作用与功能,加深对行的认识,引出新的视角与场景。
为什么大多数命令、编辑器以行为起点(最小处理单元),是有原因的!
把文件作为最小单元处理,是文件系统、操作系统的事情,不需要太多的人分析、研究。而以字符作为最小单元处理,是ASCII、UTF-8等各类编码的事情,也不需要多少人攻关(实际上是难度太大,与文件系统、操作系统一样,极难更新而有效应用)。而由字符、控制符、单词等如何构成行,行与行如何组合,如何修改行,才是大多数人要关注的工作核心。
可能有人会说,我每天接触的是文件不是行。实际上,我们打开文件,读写文件,更多的是对行的编辑!
修改一个单词,添加一项注释,删除多余空行等等,与其说是对文件的操作,不如说是对行的增删改查处理。
只有对行有了充分理解,深入研究,才能编写出sed命令(非常好用的一款流编辑器),才能开发出awk强大的文本编辑工具,以及高效的vim可视化交互式编辑器。
本文主要从行的层级、结构、属性、功能等方面作一分析,抛砖引玉,提高对行的认知与掌控。
一、行的层级
文件一一行组合(向上)→文件→文件系统
字符一一行构成(向下)←单词、字符、控制符、不可见符号
行一一居于中间层级,承接由字符转为文件的繁琐任务。
我们对文件的认识,大多数基于行的状态:
空文件(空行、空字符)
少行文件(单行或少量行数文件,大多由echo命令重定向到文件)
多行文件(编辑代码、开发项目、导入导出、小文件组合等方式创建的文件)
我们透过不同类型的文件,对文件中行的分类,作一归纳。
从应用命令、编写代码方面,可分为:
逻辑行
物理行
从行的内容上分类:
空行
非空行
从行的结构上分类:
控制行
代码行
块
从编译方面分类:
注释行
空行
编译行
二、行的构成
单词、字符、控制符、不可见字符、不可打印字符等
旧行合并新行:
双行变单行,多行变单行
旧行拆分新行
单行变双行、多行、单词、空行
三、行的属性
从行的多少(行数),行的长短(字符数),行的组合(交换、拆分、组合)等方面着手,主要属性包括:
可见性、功能性、层次性、分解性、组合性
附加属性包括:
行号 在文件中的位置标记
换行符 行与行的区分方式\n \r\n \r
^开头 每行必须有一个
$结尾 每行可有一个。有时指换行符,有时指具体的某一可见字符,需具体情况具体分析
四、行的功能
1.完成一定任务
2.代表一种形式
3.占居一个位置
对行的功能不同人有不同的认识与理解,行必须具有条理、有序、易读、可编辑等特点,这即是其功能,也是我们的基本要求。
五、行的处理
不同语言、不同编辑器、不同命令等,处理方式不一样,各有千秋,不必强求统一。但对行的处理,不外乎这几种情况:
读―― read按行读取是大多数高级语言、常用编辑器的首选。这是必备操作。
写―― write通常在某一行前或后添加新内容,此类操作也非常多。
存――仅对文件中的一行或几行单独存储为一个文件,也是创建新文件的方法,多种手段可以实现。
改――可用vim,交互式、随改随看的方式,针对具体一行或多行进行修改、处理。可用sed,用指定行范围的模式,用单字母命令c进行修改行内容
删―― d delete dd 删除不需要的行,或重复行,也是常见操作。
六、行的工具
1.编辑器
vim 对整个文件可见,选择行处理修改等操作具有由行向上到文件的特性
ex 以行为主,单行显示处理
sed 以行为单元,顺序执行每一行。这是典型的按行处理,处理不完不进入下一行。并且处理过的行不能返回去再处理一次(如若仍想处理前面的行,只能重新sed命令)。
awk 以行为平台,具有向下属性。把行分解,各种细分,排列组合,形成新的内容或数据。这是对行的充分利用,彰显行的结构化输出!
2.命令
查看cat head less
> 覆盖
>> 追加
依据命令行、编辑器、脚本文件对文本处理的殊途同归的原理,介绍讨论很多,此处不再讨论。
小结
有几句话说得好,人们为什么总喜欢按行处理文件?
1.更集中注意力
2.更详细
3.与发行版无关(跨平台)
4.提高生产力
PS:本文所有配图均为查看文件总行数