文本编辑吐血整理,欢迎指正和补充
shell中常见的文本处理器
sed awk grep egrep
uniq sort tr
正则表达式:用字符串俩描述皮、匹配一系列符合某个规则的字符串
正则表达式组成
普通字符
大小写字母、数字、标点符号和其他符号
元字符
表达式中具有特殊意义的专用字符
层次
基础正则表达式元字符
\ 转义字符
^ 以什么开始
$ 以什么结束
. 除空行外匹配任意字符
* 匹配前面子表达式0次或多次
[list] 匹配list列表中任意一个字符
[^list] 匹配任意不是list列表中的一个字符
\{n\} 匹配前面子表达式n次
\{n,\} 匹配前面子表达式n次或以上
\{n,m\} 匹配前面子表达式n到m次
扩展正则表达式元字符
+ 匹配前面子表达式一次或以上
? 匹配前面子表达式0或1次
() 将小括号内容作为整体
| 逻辑或匹配
^ 以什么开头
$ 以什么结尾
sed工具
文本处理工具,读取文本内容,根据指定条件进行处理:删除替换添加等
可在无交互的情况下实现复杂的文本处理操作
被广泛应用于shell脚本,完成自动化处理任务
sed依赖于正则表达式
sed命令是读取文件并放入内存,如果没有-i选项不会直接编辑原文件,而是对内存文件进行增删改查
工作原理
读取——执行——显示
常用选项
-e 指定要执行的命令,只有一个编辑命令时可省略
-n 只输出处理后的行,读入时不显示
-i 直接编辑文件,不显示结果
-f 用指定脚本处理对应文本文件
1编辑指令的格式:
地址1地址2 操作 参数(编辑指令统一用单引号包含)
(1)地址形式(统一用/包含住)
数字 正则表达式 $
没有地址,代表处理文件所有行
(2)操作
P 打印或输出:如果同时指定行,表示打印指定行;如不指定,则打印指定内容;
如果有非打印字符(如空格)则以ASCII码输出,其通常与“-n”选项一起使用
s =s/g替换:替换指定的字符
c 替换:将指定行替换为指定内容
a 增加:在当前一行下面增加一行指定内容
d 删除:删除指定行
i 插入:在当前一行上面增加一行指定内容
y 字符转换
r
\w:写入另一个文件
(3)参数
只要满足条件全部进行处理,默认省略g
举例练习
打印显示
sed -n '4,/the/p' kgc.txt 从第四行开始筛选打印,直到筛选出第一个带the的行并打印结束
sed -n '/the/=' kgc.txt 打印包含the所在的行号,不显示内容 注意:此时没有p
nl kgc.txt | sed -n '/the/p' 打印包含the所在的行,同时显示行号
sed -n '/^PI/=' kgc.txt 打印以PI开头所在的行号 不显示内容 注意:^也在/内嵌套
删除 思考:删除时为什么没有-n选项
nl kgc.txt | sed '3d' 删除第三行后显示剩余全文和行号
nl kgc.txt | sed '/cross/d' 删除cross所在的行后显示行号和剩余行内容
sed '/[a-z0-9]/d' kgc.txt 删除包含数字和小写字母所在的行
sed '/^[a-z0-9]/d' kgc.txt 删除小写字母和数字开头的行后显示剩余行内容
sed '/\.$/d' kgc.txt 删除以.结尾的行
替换
sed 's/the/THE/' kgc.txt 把每一行the替换成THE,g可省略
sed 's/o//g' kgc.txt 把o换为空字符,等于删除o
sed '/the/s/^/#/' kgc.txt 对the所在行的开头替换为#
sed '/the/s/o/O/g' kgc.txt 对the所在行的o替换为O
sed '3cHELLO world' test.txt 行的替换
sed 'y/s/S/' test.txt 字母替换,默认替换所有适配字母
剪切
sed '1,3{H;d};10G' kgc.txt
vim yd.sh
1,3H
d
10G
sed -f yd.sh kgc.txt
执行脚本移动指定行到指定地点
sed '/the/{H;d};$G' kgc.txt 将the所在行放入剪贴板后删除原有内容,放到尾行的行
尾,最后显示全文
sed '1,3{H;d};8G' kgc.txt 将1-3行放入剪贴板后删除原有内容,放到第八行的行尾,
最后显示全文
增加追加
sed '/the/w a.txt' kgc.txt 把the所在行另存到a.txt中
sed '3akgckgckgc' kgc.txt 把第三行后加入新的行:kgckgckgc
sed '/the/akgc1\nkgc2\nkgc3' kgc.txt \n为换行
将指定行下方添加三行内容,第一行kgc1第二行kgc2第三行kgc3
nl test.txt | sed '3aHELLO world\n\t\tHELLO world'
换行+tab+tab
sed '3a\ \t\tHELLO world\n' kgc.com
tab+tab+HELLO world+换行
插入,在行上方添加
sed '5iHELLO world' test.txt 在第五行上方添加一行HELLO world
sed '2,4iHELLO world' test.txt 从第二到第四行添加HELLO world
sed '2,4i"HELLO world"' test.txt 意义相同,将插入内容用双引号标记,world后是双引号加单引号
grep练习
grep -n 'the' test.txt
grep -in 'the' test.txt
grep -vn 'the' test.txt
grep -n 'sh[io]rt' test.txt
利用中括号“[]”来查找集合字符
grep -n 'oo' test.txt
grep -n '[^w]oo' test.txt
匹配oo前不是w的行。 注意11行
grep -n '[^a-z]oo' test.txt
匹配oo前不是小写字母的行
grep -n '[0-9]' test.txt
匹配数字行
grep -n '^the' test.txt
grep -n '^[a-z]' test.txt
匹配小写字母开头的行
grep -n '^[A-Z]' test.txt
grep -n '^[^a-zA-Z]' test.txt
匹配开头不是字母的行
grep -n '\.$' test.txt
以"."结尾的行
grep -n '^$' test.txt
grep -n 'w..d' test.txt
中间有任意两个字符
grep -n 'ooo*' test.txt
oo后面有0或多个o
grep -n 'w.*d' test.txt
w和d中间可以是任意字符
grep -n '[0-9]' test.txt
grep -n '[0-9][0-9]*' test.txt
有什么区别?
grep -n 'o\{2\}' test.txt
匹配两个o
grep -n 'wo\{2,5\}d' test.txt
中间有2~5个o
grep -n 'wo\{2,\}d' test.txt
有2个以上的o
eprep练习
egrep -n 'wo+d' test.txt
重复至少一次
egrep -n 'bes?t' test.txt
重复0或1次
egrep -n 'of|is|on' test.txt
匹配"of"或者"if"或者"on"
egrep -n 't(a|e)st' test.txt
匹配tast和test
egrep -n 'A(xyz)+C' test.txt
开头的"A"结尾是"C",中间有一个以上的"xyz"