sed
流编辑器(流编辑器可以对从管道这样的标准输入接收到的数据进行编辑.)
-sed 是基于行的,按顺序对每一行执行命令。
-sed 处理数据时,将一行读入其模式缓冲区,执行编辑命令,再打印模式缓冲区。然后它对后面的每一行重复这些步骤。
-再次强调,
sed是基于行的,逐行处理数据。
基本操作:
sed -e '5d' // 删除第5行,其他行输出
工作地址: 5 第五行
执行的命令: d 删除操作
sed -e '5,10d' // 删除5到10行
利用正则指定地址范围: 将正则表达式用
两个斜杠/扩起来,指定一种模式,后面紧跟一条命令来处理与该模式匹配的行。习惯将命令用单引号扩起来比较好!
sed -e '/正则表达式/command'
常见的命令: d 删除命令
p 打印命令
-e 使用脚本 -n(安静模式,不私自输出)与命令p搭配,输出指定模式的行
eg.
sed -e -n '/regexp/p' # regexp就是正则表达式
使用两个用逗号分开的正则表达式,指定一个范围:
sed -e '/Begin/,/End/command'
类似于 '1,5/p' ,只不过这里的起始和结束都是正则表达式,需要用//扩起来。
eg.
sed -n -e '/main[[:space:]]*(/ , /^}/p' /tmp/main.c
//
[[:space:]]是posix字符集,用来表示所有空白字符(制表符、空格、新的行),加上*后,表示main和(之间有0个或多个空白.
// 这个sed的起始匹配行:包含有 main ()或main()的行,结束匹配行:以 } 开头的行
替换: 's///'
's///g'
s/// 表示替换 g告诉sed执行全局替换 !!!
没有g时只对第一个匹配项进行替换操作.
常见命令:
'1,10s///g' 对1-10行的所有匹配项执行替换命令
'/Begin/,/End/s///g' 对Begin到End范围内的所有匹配行执行替换命令
当正则表达式或替换字符串有斜杠‘/’出现时可以使用其他字符替换斜杠.
's///' <==> 's:::' <==> 's###' ...
sed中模式之间交换位置
()之间的模式(各段)将被保留在模式缓冲区,\n可以实现对前面()之间的模式的引用,n从1到9.
sed -r 's/(段1)(段2)(段3)/\1\2\3/g' 默认从左到右 \1\2\3
sed -r
's/(段1)(段2)(段3)/\3\2\1/g'
将 第一段和第三段交换位置
...
sed某一行前新增一行
插入命令: i
sed -e '地址范围
i\string' //string为要追加的内容,不需要引号将string括起来
sed某一行后追加一行
追加命令:a
sed -e '地址范围
a\string'
sed 组合命令
适合于: 需要将多个命令应用到同一行中
指定多条命令时,
sed会按顺序将命令应用到每一行。
(1)
使用分号分隔命令
eg. sed -n -e '=;p' /etc/passwd // 第一个命令=告诉sed打印行号,第二个命令p告诉sed打印改行.
(2)
为每条命令使用一个 -e 参数
sed -n -e '=' -e 'p'
/etc/passwd
// -e指定的命令一次应用到每一行
(3)
命令太多时,将命令写入文本文件中,通过 -f 参数引用命令,就不需要-e参数了
sed命令脚本:
handle.sed
1d # 告诉sed删除第一行
s#/sbin/nologin#/bash#g # 执行替换
p # 告诉sed 打印该行
再引用此文件:
sed -n -f handle.sed /etc/passwd
sed 将多条命令应用到一个地址范围
应用场景:对一个范围内的所有行执行多条命令时
语法:
地址范围{命令串} //命令之间用(;)隔开.
sed -e '/Begin/,/End/{命令1;命令2;命令3....}/'
eg.
sed -n -e '1,5{s#/sbin/nologin#/bash#g ; s/:/|/g ; p}' /etc/passwd
// 对
/etc/passwd 中的1-5行依次执行 替换、再替换、打印.
sed 实际的例子:
Unix和DOS/Windows系统纯文本格式的换行方式是不同的。基于Dos/Winsows的文本文件在每一行末尾有一个CR(回车)和LF(换行),而Unix文本每一行结尾只有一个换行。有时需要在Unix和Windows之间互相使用同一个文本文件,Unix上bash只要一遇见回车就出问题。
利用 sed 实现windows和Unix之间文本文件的互相转换:
Unix->Win:
sed -e 's/$/\r/g' Myunix.txt > Mywin.txt # 在一行的末尾前插入回车
Win->Unix:
sed -e 's/.$//g' Mywin.txt > Myunix.txt # 将每行的最末字符回车删除
sed正则:
sed中,为了匹配特殊字符,必须将它用[::]扩起来!(类似posix字符集)
- 比如: 要匹配行中的冒号‘:’,正则应这样写[:::],否则:就是一个普通的冒号.
总结: sed命令可分为两部分:
第一部分:
选定地址范围。可以通过指定起始行和结束行来选定不分行,也可以通过匹配(正则)选定特定的范围,这给程序带来巨大的灵活性。
第二部分:
对地址范围执行特定操作。常见的操作有替换(重要)、删除(d)、打印(p)、插入(i)、追加(a)
sed 命令可以组合,完成复杂的任务。甚至写成脚本,定制想要的功能。