1、sed 是什么
sed 全名为 stream editor,流编辑器,用程序的方式来编辑文本,功能相当的强大,可以在大多数操作系统中使用。
sed 的出现作为 grep 的继任者,与vim等编辑器不同,sed 是一种非交互式编辑器(即用户不必参与编辑过程),它使用预先设定好的编辑指令对输入的文本进行编辑,完成之后再输出编辑结构。sed 基本上就是在玩正则模式匹配,所以,玩sed的人,正则表达式一般都比较强。
2、sed 工作原理
sed 会一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,成为"模式空间",接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
语法:
sed [options] '[地址定界] command' file(s)
默认情况下sed会对每一行内容进行匹配、处理、输出,某些情况不需要对处理的文本全部编辑,只需要其中的一部分,比如1-10行,偶数行,或者是包含"hello"字符串的行,这种情况下就需要我们去定位特定的行来处理,而不是全部内容,这里把这个定位指定的行叫做"定址"。
常用选项options演示
[root@localhost ~]# cat z aaa bbbb ccc AABBCCDD [root@localhost ~]# sed '/aaa/p' z #匹配到的行会打印一遍,不匹配的行也会打印 aaa aaa bbbb ccc AABBCCDD [root@localhost ~]# sed -n '/aaa/p' z #-n不显示没匹配的行 aaa [root@localhost ~]# sed -e 's/a/A/' -e 's/b/B/' z #-e多点编辑 Aaa Bbbb ccc AABBCCDD [root@localhost ~]# cat sed.txt s/A/a/g [root@localhost ~]# sed -f sed.txt z #-f使用文件处理 aaa bbbb ccc aaBBCCDD [root@localhost ~]# sed -i.bak 's/a/A/g' z #-i直接对文件进行处理 [root@localhost ~]# cat z AAA bbbb ccc AABBCCDD [root@localhost ~]# cat z.bak aaa bbbb ccc AABBCCDD
地址界定演示
[root@localhost ~]# cat z AAA bbbb ccc AABBCCDD [root@localhost ~]# sed -n 'p' z #不指定行,打印全文 AAA bbbb ccc AABBCCDD [root@localhost ~]# sed '2s/b/B/g' z #替换第2行的b->B AAA BBBB ccc AABBCCDD [root@localhost ~]# sed -n '/AA/p' z #打印AA的行 AAA AABBCCDD [root@localhost ~]# sed -n '1,2p' z #打印1-2行 AAA bbbb [root@localhost ~]# sed -n '/AAA/,/DD/p' z AAA bbbb ccc AABBCCDD [root@localhost ~]# sed -n '2,/DD/p' z bbbb ccc AABBCCDD [root@localhost ~]# sed '2~2s/[bB]/Z/g' z #将偶数行的b或A替换为Z AAA ZZZZ ccc AAZZCCDD
编辑命令command演示
[root@localhost ~]# cat z AAA bbbb ccc AABBCCDD [root@localhost ~]# sed '2d' z #删除第2行 AAA ccc AABBCCDD [root@localhost ~]# sed -n '2p' z #打印第2行 bbbb [root@localhost ~]# sed '2a123' z #在第2行后加123 AAA bbbb 123 ccc AABBCCDD [root@localhost ~]# sed '1i123' z #在第1行前加123 123 AAA bbbb ccc AABBCCDD [root@localhost ~]# sed '3c123\n456' z #替换第3行内容 AAA bbbb 123 456 AABBCCDD [root@localhost ~]# sed -n '3w/root/z3' z #保存第3行的内容到z3文件中 [root@localhost ~]# cat z3 ccc [root@localhost ~]# sed '1r/root/z3' z #读取z3的内容到第1行后 AAA ccc bbbb ccc AABBCCDD [root@localhost ~]# sed '=' z #=打印行号 1 AAA 2 bbbb 3 ccc 4 AABBCCDD [root@localhost ~]# sed -n '2!p' z #打印除了第2行的内容 AAA ccc AABBCCDD [root@localhost ~]# sed 's@[a-z]@\u&@g' z #将全文的小写字母替换为大写字母 AAA BBBB CCC AABBCCDD
选项:
1.一个案例+示意图演示
案例:倒序输出文本内容
[root@localhost ~]# cat num.txt one two three [root@localhost ~]# sed '1!G;h;$!d' num.txt three two one
示意图如下:
[root@localhost ~]# cat z 1 2 11 22 111 222 #将匹配到的1复制到保持空间,并删除模式空间的1,再匹配2时,将保持空间的文本追加到匹配的2后面 [root@localhost ~]# sed '/1/{h;d};/2/{G}' z 2 1 22 11 222 111
[root@localhost ~]# cat c hello world 1 hello world 2 hello world 3 hello world 4 happy #将多个空行减少到一行 [root@localhost ~]# sed '/^$/{N;/^\n$/d;}' c hello world 1 hello world 2 hello world 3 hello world 4 happy [root@localhost ~]# sed '/^$/{N;/^\n$/D;}' c hello world 1 hello world 2 hello world 3 hello world 4 happy [root@localhost ~]#