sed:编辑器 流编辑器,文本流编辑
ed: Stream EDitor, 行编辑器; 介绍:sed是 一个非交换性文本流编辑器,它编辑文件或标准输入导出的文本拷贝。标准输入可能来自键盘、文件重定向、字符串或变量,或者管道的文本。 sed可以干什么? 别忘了vi也是一个文本编辑器。sed可以随意编辑小或大的文件,有许多sed命令用来编辑、删除,并允许做这项工作时不在现场。sed一次性处理所有改变,因而变得效率高,节省时间。
sed工作原理
pattem space:模式空间 读取文件一行至模式空间 sed命令是面向行处理的,每次处理一行内容。处理时,sed会把要处理的行存储在缓冲区中,接着用sed命令处理缓冲区的内容,处理完成后,把缓冲区内容送至屏幕。接着处理下一行,不断重复,直到末尾,这个缓冲区被称为"模式空间"。
用法:
sed [选项] sed 命令 输入文件 script: '地址命令' 在命令行使用sed命令时,实际上命令要加单引号,sed也允许加双引号。
常用选项:
-n:不输出模式中的内容至屏幕; -e: 多点编辑; -f /PATH/TO/SCRIPT_FILE: 从指定文件中读取编辑脚本; -r: 支持使用扩展正则表达式; -i: 原处编辑; 地址定界: (1) 不给地址:对全文进行处理; (2) 单地址: #: 指定的行; /pattern/:被此处模式所能够匹配到的每一行; (3) 地址范围: #,# #,+# /pat1/,/pat2/ #,/pat1/ (4) ~:步进 1~2:所有奇数 2~2:所有偶数 编辑命令: d: 删除 p: 显示模式空间中的内容 地址定界 一块使用,被地址界定的,通常与-n a \text:在行后面追加文本;支持使用\n实现多行追加; i \text:在行前面插入文本;支持使用\n实现多行插入; c \text:替换行为单行或多行文本; w /path/to/somefile: 保存模式空间匹配到的行至指定文件中; r /path/from/somefile:读取指定文件的文本流至模式空间中匹配到的行的行后; =: 为模式空间中的行打印行号; !: 取反条件; s///:支持使用其它分隔符,s@@@,s###; 替换标记: g: 行内全局替换; p: 显示替换成功的行; w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中; sed 's@r..t@&er@' /etc/passwd 后向引用
练习:
使用-p显示行 print 命令格式为[address,[address]p,一般跟-n选项 显示/etc/passwd第二行 sed -n '2p' /etc/passwd 显示/etc/passwd前三行 sed -n '1,3p' /etc/passwd 显示以root开头的行 sed -n '/^root/p' /etc/passwd 显示已root开头和nologin结尾的行 sed -n '/^root/,/nologin$/p' /etc/passwd 打印最后一行 sed -n '$p' /etc/passwd 打印首行 sed -n '1p' /etc/passwd 打印全部 sed -n '1,$p' /etc/passwd 使用模式和行号进行查找 格式--->line_number,/pattern/ 在11行查找root sed -n '11,/root/'p /etc/passwd 显示所有奇数行 sed -n '1~2p' a 显示所有偶数行 sed -n '2~2p' a d: 删除 删除/etc/passwd第一行 sed -n'1d' /etc/passwd 删除第一到第三行 sed -n '1,3d' /etc/passwd 删除最后一行 sed '$d' /etc/passwd 删除uucp这个字符串的一行 sed -n '/uucp/d' passwd a \text 在root行前面追加hello word sed -i '/root/ a \hello word' passwd i \text 在root行后面追加hello word sed -i '/root/ i \hello word' passwd c \text 替换root所在的行为hello word sed -i '/root/ c \hello word' passwd s///---->替换 替换night为NIGHT sed -n 's/night/NIGHT/' a 删除第7行的# sed '7s/\#//' fstab 把所有的ntp换成the sed 's@ntp@the@g' passwd sed 's#ntp#the#g' passwd sed 's/ntp/the/g' passwd 把的ntp换成the,替换后的结果保存到sed.out sed 's/ntp/the/g w sed.out' passwd 删除/boot/grub/grub.conf文件中所有以空白开头的行行首的空白字符; ~]# sed 's@^[[:space:]]\+@@' /etc/grub2.cfg 删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符; ~]# sed 's@^#[[:space:]]\+@@' /etc/fstab echo一个绝对路径给sed命令,取出其基名;取出其目录名; ~]# echo "/etc/sysconfig/" | sed 's@[^/]\+/\?$@@'
高级编辑命令:
h: 把模式空间中的内容覆盖至保持空间中; H:把模式空间中的内容追加至保持空间中; g: 从保持空间取出数据覆盖至模式空间; G:从保持空间取出内容追加至模式空间; x: 把模式空间中的内容与保持空间中的内容进行互换; n: 读取匹配到的行的下一行至模式空间; N:追加匹配到的行的下一行至模式空间; d: 删除模式空间中的行; D:删除多行模式空间中的所有行; sed -n 'n;p' FILE:显示偶数行 sed '1!G;h;$!d' FILE:逆向显示文件内容 sed '$!N;$!D' FILE: 取出文件后两行; sed '$!d' FILE:取出文件最后一行; sed 'G' FILE: 加空白行 sed '/^$/d;G' FILE: 多空白行合并 sed 'n;d' FILE: 显示奇数行; sed -n '1!G;h;$p' FILE: 逆向显示文件中的每一行;
一些快速删除命令
's / \ . $ / / g' 删除以句点结尾行 '-e /abcd/d' 删除包含a b c d的行 's / [ ] [ ] [ ] * / [ ] / g' 删除一个以上空格,用一个空格代替 's / ^ [ ] [ ] * / / g' 删除行首空格 's / \ . [ ] [ ] * / [ ] / g' 删除句点后跟两个或更多空格,代之以一个空格 '/ ^ $ / d' 删除空行 's / ^ . / / g' 删除第一个字符 's /CO L \ ( . . . \ ) / / g' 删除紧跟COL的后三个字母 's / ^ \ / / / g' 从路径中删除第一个\ 's / [ ] / [ ] / / g' 删除所有空格并用tab键替代 'S / ^ [ ] / / g' 删除行首所有tab键 's / [ ] * / / g' 删除所有tab键
sed 的一些很有用的替换
显示/etc/passwd中前5行的用户名 head -n 5 passwd | sed 's/:.*$//' 将以d或D开头的行,所有小写x换成大写X sed '/^[dD]/s/x/X/g' test 删除每行最后的两个字符 sed 's/..$//' test 删除每行前两个字符 sed 's/..//' test
&的妙用
[root@localhost ~]# cat b Beijing London [root@localhost ~]# sed 's/B.*/&2008/' b Beijing2008 London [root@localhost ~]# sed 's/Bei/&2008/' b Bei2008jing London
sed中()有深意
echo "hello word" | sed 's/\(hello\).*/word \1/' 定位行范围 sed -n '/2005/,/2007/p' abc -e选项设置 sed -n -e '1,2p' -e '4p' abc sed -e 's/Beijing/London/g' -e '/Beijing/d' abc -f 选项设定command文件 cat callsed /2004/,/2006/p sed -n -f callsed abc Beijing 2004 Beijing 2005 Beijing 2006 内容插入体验 在2005行下面插入ins.txt sed '/2005/r ins.txt' abc
sed动作使用
y动作 实现前后字符替换 sed 'y/ei/ie' mysed.txt y///和s///区别 y的语法格式是y/source/dest,表示将source中的字符对位替换为dest中的字符;而s/regexp/replacement/,表示通过正则匹配到的内容替换为replacement部分。 y只是简单的逐字体换,没有很多花样。s支持&符号和预存储等特性,可以实现更多灵活的替换效果。 sed 'y/ee/ie/' mysed.txt n动作使用 sed '/200/{n;y/eijing/EIJING/;}' mysed.txt Beijing 2003 BEIJING 2004 n隔行替换
原创文章,作者:N21_ Dominic,如若转载,请注明出处:http://www.178linux.com/56669
评论列表(1条)
是不是还有awk的没有写,sed的写的很棒,期待你的awk的佳作