① linux基本操作10-----正则表达式与文件格式化处理
一
正则表达式
1
简单的说正则表达式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易的达到查找,删除,替换某特定字符串的处理程序
2
grep在数据中查找一个字符串时,是以整行为单位来进行数据的选取的,也就是说假如一个文件内有10行,那么其中两行是有用的,那么就将这两行显示出来,其它的丢弃
3
在bash当中,我们知道通配符*可以用来表示任意个字符,但是正则表达式中的*表示不同的含义
在正则表达式中,'.'表示的是一定有一个任意字符的意思
在正则表达式中,'*'表示的是重复前一个字符0到无穷多次的意思
4
基础的正则表达式
RE字符
意义
^word
查找行首为word的行
word$
查找结尾为word的行
.
代表一定有一个任意的字符
*
重复前一个字符0个到无穷多个
[list]
从字符集合里面选择一个字符
[n1-n2]
从要选择的范围里面选择一个字符
[^list]
从不是这个字符集合里面找出一个字符
/{n,m/}
连续n到m个的前一个字符,/{n/}则是连续n个前一个字符,/{n,/}则是联系n到无穷多个前一个字符
二
sed
工具
1
sed本省是一个管道命令,可以分析标转输入,而且sed还可以将数据进行替换,删除,新增,选取特定行等功能
2
sed的用法
sed
[-nefr]
[动作]
-n
使用安静模式,在一般模式中,所有来自stdin的数据一般都会被列出到屏幕上,但是如果加上-n这个参数的话,则只有经过sed特殊处理的那一行才会被列出
-e
直接在命令模式上进行sed的动作编辑
-f
直接将sed的动作写在一个文件内,-f
filename则可以执行filename内的sed动作
-r
sed的动作支持的是扩展正则表达式的语法
-i
直接修改文件的内容,而不是由屏幕输出
3
动作说明
n1,n2
function
n1,n2不见得会存在,一般代表的是进行的动作的行数
function有下面这些参数
a:
新增,a的后面可以接字符串,而这些字符串会在新的一行出现,目前的下一行
c:
替换,c的后面可以接字符串,这些字符串可以替换n1,n2之间的行
d:
删除,因为是删除,所以d后面通常不接任何参数
i:
插入,i的后面可以接字符串,而这些字符串会在新的一行,目前的上一行
p:
打印,也就是将某个选择的数据打印出来
s:
替换,可以直接进行替换的工作
三
文件的格式化以及相关处理
1
格式化打印
printf
'打印内容‘
实际内容
关于C程序语言内,常见的变量格式
%ns
那个n是数字,s代表的是string
%nd
那个n是数字,d代表的是整数
%N.nf
那个n与N都是数字,f代表浮点数
2
文件比较工具diff
diff就是用在比较两个文件之间的区别,并且是行为单位来比较的,一般是用在ASCLL纯文本文件的比较上
diff的用法
diff
[-bBi]
from_file
to_file
-b
忽略一行当中仅有多个空白的区别
-B
忽略空白行的区别
-i
忽略大小写的不同
3
如果我们要将旧的文件升级成为新的文件时,我们可以先利用diff比较出文件的区别,并将区别文件制作成为补丁文件,再由补丁文件更新旧文件即可。
一般来说我们使用diff制作出来的比较文件通常扩展名为.patch
更新:patch
-pN
<
patch_file
还原:patch
-R
-pN
<
patch_file
② Linux sed 命令详解
一、基本正则列表与扩展正则
二、sed 文本处理工具的用法介绍
三、认识sed工具的 n、r、i 选项指令
四、认识sed工具的 p、d、s 条件指令
五、认识sed工具的 i、a、c 条件指令
六、认识sed高级应用 r、w 条件指令
七、综合案例
Linux sed
Stream EDitor,流式编辑器
一、基本正则列表与扩展正则
根据推出时间的不同,分为基本正则和扩展正则,扩展正则在基本正则的基础上做了一些优化和新增了一些正则表达符号,因为一些命令没有及时更新,所以你可能会遇到有些命令只支持基本正则,不支持扩展正则,或者需要添加一些支持扩展正则的选项。
关于正则与扩展正则区别的详细介绍可以看我另一篇shell 正则的介绍
基本正则列表
扩展正则列表
二、sed 文本处理工具的用法介绍:
相关说明如下:
sed命令的常用选项如下:
sed命令常用条件指令如下
三、认识sed工具的 n、r、i 选项指令
# sed [选项] '条件指令' 文件.. ..
上面的条件指令 我们可以拆分为 # sed [选项] '范围界定+操作指令' 文件.. .. 的格式这样更容易理解
sed命令可以使用行号或正则做为条件匹配:
1)sed命令的 -n 选项
执行p打印等过滤操作时,希望看到的是符合条件的文本。但不使用任何选项时,默认会将原始文本一并输出,从而干扰过滤效果。比如,尝试用sed输出/etc/hosts的第1行:
可以发现所有的行都被显示出来了(第1行重复2次)。—— 正确的用法应该添加 -n 选项,这样就可以只显示第1行了:
行号可以是连续的行号,如打印passwd第3到第6行账户的信息:
2)sed命令的 -r 选项
需要用到扩展正则时,需要加 -r选项
3)sed命令的 -i 选项
正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,而并不会对原始文件做任何更改:
若希望直接修改文件内容,应添加选项 -i 。
需要特别注意的是,和一些指令组合和使用的先后顺序都会对最终输出结果产生影响
例如: 指令 -n、和操作操作p
比如,直接删除test.txt(自行创建一个任意内容的文件)的第1~4行:
下文中关于使用sed修改文件的示例中,为了避免大家在练习过程中因误操作导致系统故障,命令省略 –i 选项,不再逐一说明。需要时,大家可自行加上此选项。
4)多个指令可以使用分号隔离
用分号来隔离多个操作,比如:
1)行号案例
2)正则案例
3)没有条件,则表示匹配所有行
四、认识sed工具的 p、d、s 条件指令
1)下面看看sed工具的p指令案例集锦(自己提前生成一个a.txt文件)
2)下面看看sed工具的d指令案例集锦(自己提前生成一个a.txt文件)
3)sed命令的s替换基本功能(s/旧内容/新内容/选项):
4)下面看看sed工具的s指令案例集锦(自己提前生成一个a.txt文件)
注意:替换操作的分隔“/”可改用其他字符,如#、&等,便于修改文件路径
以下操作使用nssw.txt作为测试文件。
参考数据文件内容如下:
5)删除文件中每行的第二个、最后一个字符
分两次替换操作,第一次替换掉第2个字符,第二次替换掉最后一个字符:
6)将文件中每行的第一个、倒数第1个字符互换
每行文本拆分为“第1个字符”、“中间的所有字符”、“倒数第1个字符”三个部分,然后通过替换操作重排顺序为“3-2-1”:
7)删除文件中所有的数字
因原文件内没有数字,行首也没有空格,这里在内容中新增一些数字另外新几行内容 首行添加几行空格,生成一个新测试文件以 nssw2.txt
以nssw2.txt文件为例,删除所有数字、行首空格的操作如下:
8)为文件中每个大写字母添加括号[]
使用“()”可实现保留功能,所以可参考下列操作解决:
五、认识sed工具的 i、a、c 条件指令
# sed [选项] '条件指令' 文件..
sed工具的多行文本处理操作:
基本语法格式案例:
1)sed命令的 i 指定行之前插入基本功能
2)sed命令的a追加基本功能
3)sed命令的c替换基本功能
六、认识sed高级应用 r、w 条件指令
1)sed命令的 r 读取文件
2)sed命令的 w 保存到文件
七、综合案例
1) 综合案例1
2)综合案例2 脚本应用
③ linux下删除某一目录下所有非文件夹的文件命令
删除文件命令
rm
NO1. 删除当前目录的文件
[root@rehat root]# rm test.txt
NO2. 强制删除当前目录的文件,不弹出提示版
[root@rehat root]# rm -f test.txt
NO3. 强制删除整个权目录,包括目录与文件全部删除,需要管理员权限
[root@rehat root]# rm -r -f test
删除文件夹命令
rmdir
NO1. 删除一个空目录
[root@rehat root]# rmdir emptydir
NO2. 删除多级空目录
[root@rehat root]# rmdir -p emptydir/d1/d11
④ linux 正则匹配 删除文件中不包含某字符串的行
sed - '/bbb/!d' filename
这样就可以了吧.
⑤ linux 删除0字节和替换0字节文件的脚本怎么写
删除,比如在当前目录下面可以用find . -name "*.sh" -size 0 -exec rm {} \;
⑥ Linux下查找替换的正则怎么写求教
root@qfgz:~/xly# cat 1
1
2
<SCRIPT adlfbhalsdf
ads
asd
fas
dflajsdhfgblahsdfb
asd-- a-sd-asd-- SCRITP>
3
4
root@qfgz:~/xly# sed "/<SCRIPT/,/SCRITP>/d" 1
1
2
3
4