本章将对文本处理三剑客其中之sed命令做一个学习小结:
文本处理三剑客:
Grep egrep fgrep
Sed:stream Editor,流编辑器 行
awk:文本格式化工具,报告生成器
Sed官方解释如下:
sed - stream editor for filtering and transforming text
Sed工作流程:
Sed 将原文本内容逐行读入到自己的工作车间,叫做pattern space(模式空间),在pattern space中按照条件进行处理,比如正则表达式,
1.如果行数据内容没有被匹配到,进入图中"NO" 之后stdout标准输出
2.如果行数据内容匹配到,进入图中“Yes” 之后进入stdout标准输出或者根据edit规则输出数据
3.Hold space与pattern space数据可以进行互换,这部分也是sed高级特性.
下面用命令和实例对sed原理加以讲解,相信大家跟下面的经典实例做些测试,会对sed命令有了更直观的理解:
Sed常用选项:
-n:不输出模式空间中的内容至屏幕;
-e script, --expression=script:多点编辑;
实例: ~]# sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab ,两个命令即为多点编辑,
-f /PATH/TO/SED_SCRIPT_FILE
注明:-f参数引用一个文件,将多个命令同时引用,文件命令格式为:每行一个编辑命令即可;
-r, --regexp-extended:支持使用扩展正则表达式;
-I [SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;所以接下来的案例都是源文件显示内容,如果有-i参数,显示的内容会保存到源文件中,此参数慎用!
地址定界:
(1) 空地址:对全文进行处理;
(2) 单地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;
(3) 地址范围
#,#:
#,+#:
#,/pat1/
/pat1/,/pat2/
$:最后一行;
(4) 步进:~
1~2:所有奇数行
2~2:所有偶数行
实例:
显示所有的奇数行:
sed -n '1~2p' /etc/passwd
编辑命令
d 删除
P 显示模式空间中的内容
a \text 在行后面追加文本“text” 支持使用\n实现多行追加
I \text:在行前面插入txt 支持使用\n实现多行追加
实例:
[root@222 ~]# sed '3a \newline\nsecond new line' /etc/fstab
c \text 匹配到的行替换为此处指定文本“text” 注意是整行替换
W /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定文件中
r /PATH/FROM/SOMEFILE:读取指定文件内容至当前文件匹配到的行处
= 为模式匹配到的行打印行号
!取反条件
s///:查找替换
替换标记:
g:全局替换
w:/PATH/TO/SOMEFILE
p:显示替换成功的行
练习1:删除/boot/grub.conf 文件中所有以空白字符开头的行的行首的所有空白字符;
~]# sed 's@^[[:space:]]\+@@' /etc/grub.conf
练习2:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
~]# sed 's@^#[[:space:]]*@@' /etc/fstab
练习3:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;
~]# echo "/var/lib/games/" | sed 's@[^/]\+/\?$@@'
Hold space与pattern space数据互换:
高级编辑命令:
h:把模式空间内容覆盖至保持空间
H:把模式空间内容追加至保持空间中
g: 把保持空间中的内容覆盖至模式空间中
G:把保持空间中的内容追加至模式空间中
x:把模式空间中与保持空间中内容互换
n;读取匹配都得行的下一行至模式空间中
N:追加读取匹配到的行的下一行至模式空间中
d:删除模式空间中的行
D:删除多行模式空间中的所有行
sed '/^$/d;G' FILE:
(1)/^$/d 是在pattern space中删除源文件所有空白行
(2)G:把Hold 保持空间中的内容追加至pattern模式空间中,保持空间数据此时是空的,所以G:是逐行向源文件添加空行:
所以该命令可以理解为删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
如图显示的源文件空白行没了,但原有内容都附加了空白行:
马哥linux培训笔记