*** sed:Stream EDitor 流编辑器 一次处理一行内容
sed [option]… 'script' inputfile…
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,
所有来自 STDIN的资料一般都会被列出到萤幕上。,加上 -n 参数后,
则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑,多个动作;
-f∶将 sed 的动作写在一个档案内, -f FILE 则可以执行 FILE 内的sed 动作;
-r∶支持扩展正则表达式
-i∶修改原文件,而不是由屏幕输出。
-i.bak 先做备份 再修改源文件;得到file.bak
常用命令:
a∶新增,a \STR,而这些字串会在新的一行出现(目前的下一行)~
i∶插入,i \STR,而这些字串会在新的一行出现(目前的上一行);
c∶取代,c \STR,这些字串可以取代 n1,n2 之间的行!
d∶删除,d 后面通常不接;
p∶列印,即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作
w /PATH: 保存模式匹配的行至指定文件
=: 为模式空间中的行打印行号
s∶取代,直接进行取代,通常搭配正则
# sed 's/要替换的字符串/新的字符串/g' 1,20s/old/new/g
替换标记:
g: 行内全局替换 3g 每行第3个字符起
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行
&代表前面匹配到的字符串 s/PATT/&/g
高级编辑命令:
h : 把模式空间中的内容 覆盖至保持空间中
H : 把模式空间中的内容 追加至保持空间中
g : 把保持空间中的内容 覆盖至模式空间中
G : 把保持空间中的内容 追加至模式空间中.
x : 把模式空间中的内容到保持空间中的内容 互换,初始保持空间中为空
n : 读取下一行覆盖模式空间中的行;#+1行已被读取,接下来会读#+2行;
N : 读取下一行并追加到模式空间中的行后面,使用\n分隔;一次读2行
d : 删除模式空间中的内容
D: 删除模式空间中匹配的多行
#sed 'n;d' 显示奇数行;先输出模式空间中的行,再覆盖读取下一行,再执行d命令
#sed 'G' /etc/issue 在原有的每行后方添加一个空白行
#seq 3 | sed '1!G;h;$!d' 倒序输出
# sed '2,$d' ab #删除 第二行到最后一行
# sed -n '$p' ab #显示 最后一行
# sed -n '/STR/p' ab #查询 包含STR所在所有行
# sed '1a tea\nor coffee' ab #第一行后 增加多行,使用换行符\n
# sed '1,2c Hi' ab #第一行到第二行 替换为Hi
# sed -i '$a bye' ab #在原文件中最后一行输入"bye"
# sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' file 每行字符倒序显示
# sed -r '/\n/!G;s/(.)(.*\n)/&\2\1/;//D;s/.//' file
# sed -n '$=' he /PATH #统计行数
将数字1234567显示为1,234,567
#echo "1234567" | sed ':a;s/\B[0-9]\{3\}\>/,&/;ta'
\w匹配每个单词,&代表前面匹配到的字符串
#echo "i am zhou"|sed 's/\w\+/[&]/g'
#sed -n 'n;p' FILE 输出偶数行
#sed '1!G;h;$!d' FILE 倒序输出文本
#sed '$!N;$!D' FILE 输出文本最后两行
#sed '$!d' FILE 显示最后一行
#sed 'G' FILE 每行后加一空白行
#sed 'g' FILE 输出空白行,与文本相同行数
#sed '/^$/d;G'FILE 删除空行,在每行后加一空行
#sed 'n;d' FILE 输出奇数行
#sed -n '1!G;h;$p' FILE 倒序输出文本
===练习:sed
1.删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
#sed 's/^[[:space:]]*//g' /etc/grub2.cfg
2.删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
#sed 's/^#[[:space:]]*//g' /etc/fstab
3.在/root/install.log每一行行首增加#号
#sed 's/^/#/' /root/install.log
#sed 's/.*/#&/'
4.在/etc/fstab文件中不以#开头的行的行首增加#号
#sed 's/^[^#].*/#&/' /etc/fstab
5.处理/etc/fstab路径,使用sed命令取出其目录名和基名
#echo "/etc/rc.d/init.d/functions"|sed -r 's@(^/.*/)([^/]+/?)@\1\n\2@g'
#echo "/etc/rc.d/init.d/functions"|sed -r 's@.*\<@@' 取基名
6.利用sed 取出ifconfig命令中本机的IPv4地址
#ifconfig|sed -rn 's/.*r:((.*\.){3}.*) B.*/\1/p'
#ifconfig|sed -rn 's/.*r:(.*) B.*/\1/p'
7.统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
#ls /tmp/Packages/|sed -nr 's/.*\.(.*)\..*$/\1/p'|sort|uniq -c
原创文章,作者:Jasper,如若转载,请注明出处:http://www.178linux.com/31897
评论列表(1条)
文章偏相于笔记,可以尝试着写上sed的工作原理,及自己在操作过程中的遇到的错误,总之一句话,要理论结合实践