文本处理工具sed
定义:
sed Stream EDitor ,又称行编辑器
sed是一种流编辑器,它一次只处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容输送到屏幕上,接着处理下一行,这样不断重复,知道文件末尾。文件内容并没有发生改变,除非你使用重定向存储输出。sed主要用来自动标记一个或多个文件,简化对文件的反复操作,编写转换程序等
用法:
Usage: sed [OPTION]... {script} [input-file]...
常用选项:
-n :不输出模式空间内容的自动打印
-e :多点编辑 比如: sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab
-f /PATH/TO/SCRIPT_FILE :从指定文件中读取编辑脚本
-r :支持使用扩展正则表达式
-i :原处编辑(警告:直接修改原文件)
地址定界:
1,空地址:对全文进行处理
2,单地址:
# :指定行
/pattern/ :被此模式所匹配到的每一行
3,地址范围
#,#
#,+#
#,/part1/
/part1/,/part2/
$:最后一行
4,步行:~
1~2:所有奇数行
2~2:所有偶数行
编辑命令:
-
d :删除模式空间匹配的行
-
p :显示模式空间中的内容
-
a \text :在行后面追加文本text,支持使用\n实现多上追加
-
i \text :在行前面插入文本text,支持使用\n实现多上插入
-
c \text :把匹配到的行替换此处指定的文本text.可以有多行
-
w /PATH/TO/SOMEFILE :保存模式空间匹配到的行至指定的文本中
-
r /PATH/FROM/SOMEFILE :读取指定文件的内容至当前文件被模式匹配到的行后面,文件合并
-
= :为模式匹配到的行打印行号
-
! :模式空间中匹配行取反处理
-
s/// :查找替换,其分隔符可自行指定,常用的有s@@@,s###等
替换标记:
g :行内全局替换
w /PATH/TO/SOMEFILE :将替换成功的结果保存至指定文件中
p :显示替换成功的行
比如:
-
sed -n '/^$/=' file 显示空行行号
-
sed -n -e '/^$/p' –e '/^$/=' file 打印空白行并显示行号
由于看不出效果,我加了一个参数 !,打印非空白行
-
sed '/root/a\superma' /etc/passwd 在匹配到root行后插入
-
sed '/^$/d' file 删除空白行
-
sed '1,10d' file 删除1-10行
-
sed 's@var@rooterr@g' /etc/passwd 替换每行所有匹配到的字符
-
sed -n 's@root@super&er@pg' /etc/passwd 全行替换root为rootroot--- &引用所匹配到的元素
-
sed –i.bak 's/dog/cat/g' file 先创建备份,在执行操作
实战练习:
1、删除/etc/grub2.conf文件中所有以空白开头的行行首的 空白字符
sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空 白字符的行的行首的#和空白字符
sed 's@^#[[:space:]]\+@@' /etc/fstab
3、在/root/install.log每一行行首增加#号
sed 's@^@#@' /etc/passwd
4、在/etc/fstab文件中不以#开头的行的行首增加#号
sed -r 's@(^[^#])@#\1@' /etc/fstab
sed 's@^[^#]@#&@' /etc/fstab
5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
echo /etc/fstab/sadfsad/sdfsadf/aa | sed -r 's@(.*/)([^/]+)\/?$@\1 \2@'
6、利用sed 取出ifconfig命令中本机的IPv4地址
ifconfig | sed -n '2p' | sed -r 's@^[[:space:]]+inet[[:space:]]@@'|sed -r 's@[[:space:]].*@@'
ifconfig| sed -r -n 's@^[[:space:]]+inet[[:space:]](.*)net.*@\1@p'
7、统计centos安装光盘中Package目录下的所有rpm文件的 以.分隔倒数第二个字段的重复次数
ls *.rpm | sed -r 's@.*\.(.*)\.rpm@\1@' | sort | uniq -c
高级编辑命令
-
h :把模式空间中的内容覆盖至保持空间中
-
H :把模式空间中的内容追加至保持空间中
-
g :从保持空间中取出数据覆盖至模式空间中
-
G :从保持空间中取出数据追加至模式空间中
-
x :把模式空间中的内容与保持空间中的内容进行互换
-
n :读取匹配到的行的下一行覆盖至模式空间中
-
N :追加匹配到的行的下一行至模式空间中
-
d :删除模式空间中的行
-
D :删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed命令
sed示例:
-
sed -n 'n;p' file 输出偶数行,相当于 sed -n '2~2p' file
-
sed '1!G;h;$!d' file 逆序输出 相当于tac命令
-
sed '$!N;$!D' file 只剩下后两行
-
sed '$!d' file 只剩下最后一行
-
sed 'G' file 每行后面追加一个空白行
-
sed '/^$/d;G' file 删除所有空白行,然后在每行后加一个空白行
-
sed -n '1!G;h;$p' 又是逆序输出