sed 工具的常用参数
sed 工具的常用参数
sed 是一个非交互式文本编辑器,它可对文本文件的标准输入进行编辑,标准输入可以来自键盘输入、文本重定向、字符串、变量,甚至来自于管道的文本,与 vim 编辑器类似,它一次处理一行的内容,sed 可以编辑一个或多个文件,简化对文件的反复操作、编写转换程序等。
在处理文本时把当前处理的的行存储在临时缓冲区中,称为“模式空间(pattern space)”紧接着用 sed 命令处理缓冲区中的内容,处理完成后把缓冲区的内容输出至屏幕或者写入文件。逐行处理直到文件末尾,然而如果打印在屏幕上,实质文件内容并没有改变,除非用户使用重写向存储输出或者写入文件。
1、替换test.txt 文本中的 old 为new ,代码如下:
sed 's/old/new/' test.txt #每行第一个匹配
sed 's/old/new/g' test.txt #替换所有old为new
2、打印test.txt 文本第一行至第三行,代码如下:
sed -n '1,3p' test.txt
3、打印第一行与最后一行,代码如下:
sed -n '1p,$p' test.txt
4、删除 test.txt 第一行至第三行
sed -n '1,3d' test.txt
#删除匹配行到最后一行
sed -n '/test/,$d' test.txt
5、删除最后6行及删除最后一行,代码如下:
for i in `seq 1 6`;do sed -i '$d' test.txt;done #-i 直接在文本中修改
sed '$d' test.txt #删除最后行
6、在test.txt 中查找 test 所在行,并在其下一行添加 word 字符串,a 表示在其下一行添加字符串,代码如下
sed '/test/aword' test.txt
sed '/test/a\word' test.txt
7、在test.txt 中查找 test 所在行,并在其上一行添加 word 字符串,i表示在其下一行添加字符串,代码如下
sed '/test/iword' test.txt
sed '/test/i\word' test.txt
8、在test.txt 查找查找以 test 结尾的行,在其行尾添加字符串word ,$ 表示结尾标识, &在 sed 中表示添加,代码如下:
sed 's/test$/&word' test.txt
9、在test.txt 查找查找以 test 结尾的行,在其行首添加字符串word ,^表示起始标识,$ 表示结尾标识, &在 sed 中表示添加,代码如下:
sed '/www/s/^/&word/' test.txt
10、多个 sed 命令命令,使用 -e 参数或分号 ; ,代码如下
sed -e '/www.rhel.tk/s/^/&1./' -e 's/www.rhel.tk$/&./g' test.txt
sed -e '/www.rhel.tk/s/^/&1./ ; s/www.rhel.tk$/&./g' test.txt
11、sed 读取系统变量,进行变更替换,代码如下
WEISITE=WWW.RHEL.TK
sed 's/www.rhel.tk/$WEBSITE/g' test.txt
sed 's/www.rhel.tk/&$WEBSITE/g' test.txt #追加
12、修改 SELINUX 策略 enforcing 为 disabled ,查找 /SELINUX/行,然后将其行 enforcing 值改成 disabled , !表示不包括/ SELINUX/行,代码如下
sed -i '/SELINUX/s/enforcing/disalbed/g' /etc/selinux/config
sed -i '/SELINUX/!s/enforcing/disabled/g' /etc/selinux/config
通常而言,sed 将待处理的行读入模式空间,脚本中的命令逐行进行处理,直到脚本执行完毕,然后该行被输出,模式空间清空,然后重复刚才的动作,文件中的新的一行被读入,直到文件处理完毕。
如果用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间等到保留以便下一次的处理,都有可能使得 sed 在处理文件的时候不按照正常的流程业进行,这里可以使用 sed 高级语法来满足用户需求,总的来说,sed 高级命令可以分为以下3种功能。
N、D、P:处理多选模式空间的问题
H、h、G、g、x:将模式空间内容放入存储空间以便接下来的编辑。
:b、t:在脚本中实现分支与条件结构
13、在test.txt 每行后面加入空行,每行后面插入两行空行,前三行每行后面插入空行
#'/^$/d’会删除原有的空行(所有),然后每行后面添加一个空行,
#使用'/*$/d','/*/d','/^*/d' 也可以匹配到,同时不会删除原有空行
sed '/^$/d;G'test.txt
#'/^$/d’会删除原有的空行(所有),然后每行后面添加两个空行(G),
#使用'/*$/d','/*/d','/^*/d' 也可以匹配到,同时不会删除原有空行
sed '/^$/d;G;G'test.txt
#'/^$/d’会删除原有的空行(所有),然后1-3行每行后面添加一个空行(1,3G),
#使用'/*$/d','/*/d','/^*/d'也可以匹配到,同时不会删除原有空行
sed '/^$/d;1,3G'test.txt
14、将 test.txt中 偶数行删除及隔两行删除一行
#删除偶数行
sed 'n;d' test.txt
#隔两行删除一行
sed 'n;n;d' test.txt
15、在test.txt 中匹配行前一行,后一行插入空行以及同时在匹配古尔戈插入空行,代码如下 :
sed '/test/{x;p;x}' test.txt #前一行,x 先进行一次交换,把2置空,然后 p 打印出新行2(在模式空间中),x 再进行一次交换打印出2
sed '/test/G' test.txt #后一行
sed 'test/{x;p;x;G}' test.txt #前后。
16、在test.txt 每行前加入数字顺序号,加上制表符“\t”及 "." 符号,代码如下
sed = test.txt # 生成数字序号, sed -n = test.txt ,仅显示序号,不显示内容
sed = test.txt | sed 'N;s/\n/ /' #加空格,N将当前读取行的下一行读入模式空间。
sed = test.txt | sed 'N;s/\n/\t/' #加制表符
sed = test.txt | sed 'N;s/\n/\./' #加 .
17、删除行首和行尾的任意字符
sed 's/^[\t]*//;s/[\t]*$//' test.txt
18、打印test.txt 文件中 word 与 test 之间的内容
sed -n '/word/,/test/'p test.txt
19、打印及删除 test.txt 最后两行
sed '$!N;$!D' test === sed 'N;$!D'(类似效果)
sed 'N;$!P;$!D;$d' test.txt === sed 'N;$d' test.txt (类似效果)
20、合并上、下两行
sed '$!N;s/\n//' test.txt
sed 'N;s/\n//' test.txt