sed命令简单归档
sed:
工作原理:从文件或者标准输入读取数据,将起复制到pattern space(模式空间)缓冲区(复制输入源的一行数据),接着sed的编辑命令对数据进行处理,比如追加、插入、替换等等,处理完后,sed将数据发送到stdout(标准输出),可以利用管道、重定向符号等等修改输出源,处理完第一行后,sed接着读取下一行,重复此过程,直到命令行或者脚本命令执行完毕。
sed命令不仅仅存在pattern space,还存在一个hold space,风骚组合
sed格式:
sed [选项] 'sed命令' [输入文件...]
一、常用选项:
-n 取消自动打印模式空间(sed默认会自动打印pattern sapce内容,而-n则会取消打印,一般配合p使用)
-e 将-e选项后的命令解释成编辑命令
-i 修改原始文件
二、sed命令
sed命令由两部分组成:定位文本和sed编辑命令。定位、定位,字面意思;编辑命令通俗点就是对定位的文本的处理动作
定位文本:
一篇文章,如何将鼠标定位到具体的位置?
1、行号,指定某一行,或者圈定范围(2-5行)
2、使用正则表达式定位(^, $ .....)
具体如下:
x x为指定的行号,$表示最后一行,sed -n '$p" /etc/passwd
x,y 指定从x到y的行号范围
/pattern/ 查询包含模式的行,比如/root/ 查找包含root字符串的行
/pattern1/,/pattern2/ 查询从模式pattern1到模式pattern2的行,谨慎使用,比如/root1/,/root2/ 查找到第一个root1到root2后,文本后再次出现root1 root2再 次显示之间的范围
/pattern/, +n 从pattern行到之后的x行之间范围,同时也存在/pattern1/,/pattern2/的再查找情况(定位模式(行),+x行)

x~step step为步长定位x行,然后每step行后,显示一行

第二行为开始行,2+7=9+7=16+7=23...,最后不足则不显示(总共38行,只显示到第37行)
/pattern/,~n 定位模式行pattern,显示pattern行到n的倍数行

到此定位文本结束,懵逼路上懵逼人
sed编辑命令:
三大杀道:追加(追杀)、插入(刺杀)、替换(幻杀)
a\ text append 追加文本
i\ text insert 插入文本
c\ text replace 替换文本

其他两个不演示
r filename append a line read from filename.

'/#/d;p' 删除/etc/fstab文件中包含#的注释行,同时'/home/r /etc/hosts' 将文件/etc/hosts内容追加到模式/home的下一行
w filename Write the current pattern space to filename 将当前pattern space内容写入到指定文件内

s/pattern/replacement/flags 查找pattern,替换成replacement,flags是对动作的进一步解释
flags标记:
g 对数据中所有匹配的内容进行替换(全局替换),如果没有g,默认替换第一个pattern,例如一行中有3个pattern
则替换第一个pattern
p 通常与-n选项结合使用,表示打印替换的行

(没有使用g时,默认替换第一个parrern,所以第二次出现的root没有被替换掉,使用了g后,所有出现的都给替换掉)
n 1~512之间的数字,表示指定第几次出现的pattern,进行替换操作
& 正则表达式,含义为pattern的“软链接”

(之所以只打印一行root是因为,下一次包含的root的行只有一个root,p参数没有对其进行操作,所以没有打印出来,同时此处很容易看出,&就是root)
w filename 将缓冲区中的内容写到指定的filename文件中
一组例子:
1、在/etc/passwd所有的root后面插入单词(语句)text(通过a\ i\都没办法实现效果,只有s通过替换的形式达到插入的目的)

2、显示控制字符(注意:各个系统控制字符可能不同) sed l (小写字符L)

(空格tab是显示的字符,所谓的控制字符就是非打印字符,例如回车、F1键等等)
3、{}符号表示在定位上执行的命令组,同时s与正则表达式结合使用也很风骚

(这里的s的定界符设为了@,不一定非要为/)
4、{}组合套装,修改定界符为@,正则表达式$将结尾修改为?

同时可以利用s将空格全部删除掉s/ //g(s后面的两个//中间是空格,最后两个//中间则无任何字符)
5、正则表达式\1

浙公网安备 33010602011771号