sed简介 : stream editor, 即行编辑器.
sed逐行处理要被处理对象文件的内容,并会把结果输送至屏幕.其为非交互式的编辑器,对文件没
有破坏性,除非加上"-i"参数,或者利用重定向的方法将结果写入文件,否则不修改源文件.
工作过程图示:
  文本文件     >       sed的模式空间    >   sed的输出

(sed的模式空间(缓冲区)位于内存中的)
sed的用法
一般命令格式:
sed  [OPTION] /PATTERN(模式)/COMMAND files  
sed  [OPTION]  ADDR1(地址1),ADDR2(地址2)/COMMAND files
sed支持使用正则表达式.
例:
以 "/proc/cpuinfo" 为操作对象 (其存放cpu信息)
以下命令均以变量"FILE"代替"/proc/cpuinfo". 顶格"#"号注释参数.
实例.
一.按地址输出信息:
1.sed -n 1,3p $FILE 输出第一行到第三行信息
2.sed -n 3p  $FILE  输出第三行信息
3.sed -n /cache/,/wp/p $FILE 输出从"cache"行到"wp"行之间的行.
4.sed -n /^[^Cc]/p $FILE 显示非"c"开头的行.
# -n 避免输出没有被模式匹配到的行.
#  p 用于打印行.
二.添加信息:
#"a\"在指定的行(后面)添加一行或多行.
1.sed "/^processor/a\#This is my cpu" $FILE 在"processor"后添加"#This is my cpu".
2.sed "/^model/a\#This is my cpu" $FILE 在"model"行后添加"#This is my cpu".
#"i\"在指定的行(前面)添加一行或多行.
1.sed "/^processor/a\#This is my cpu. \n#haha" $FILE
 在"processor" 行前添加"#This is my cpu.(换行)#haha"
#"\n"换行符.
三.删除行:
#d 用于删除模式空间中匹配的行.
1.sed /cache/d $FILE 删除"cache"行.
2.sed  /^[Cc]/d $FILE 删除以"c"字母开头的行.
四.查找和替换:
#s 表示查找替换
#g 表示全局替换
#i 表不分大小写
 格式:sed "ADDR1,ADDR2s/查找串/替换串/ig(控制符)" file
1.sed '1,$s/yes/YES/g' $FILE 将去文中"yes"替换为"YES".
#$ 表示最后一行,"$ -2" 表示倒数第三行.
2.sed  '/cache/,/wp/s/yes/YES/g' $FILE 表示将"cache"行至"wp"行中的"yes"替换为"YES".
3.sed '1,$s/\bc/C/g'$FILE
#& 保存查找串在替换串中引用.
  把cpu 换成cpu+s .
4.sed '1,$s/\b[Cc]pu\b/&s/g' $FILE
  所有以c开头的词后+s
5.sed '1,$s/\b[Cc][[:alpha:]]*\b/&s/g' $FILE
五.sed选项.
#-e 可在一个sed实例指定多个处理办法.
sed '1,$s/\b[Cc][[:alpha:]]*\b/&s/g' file | sed '1,$s/\b[m]\([[:alpha:]_]*)\b/M\1/g'
 可写为
sed '1,$s/\b[Cc][[:alpha:]]*\b/&s/g' -e '1,$s/\b[m]\([[:alpha:]_]*\)\b/M\1/g' file
#-f sed读取文件中的命令并执行.
 例: 在一个文件"file1"中添加如下内容.
第一行 :"s/\b[Cc][[:alpha:]]*\b/&s/g"
第二行 :"s/\b[m]\([[:alpha:]_]*\)\b/M\1/g"
执行:sed -f file1 $FILE
同:sed '1,$s/\b[Cc][[:alpha:]]*\b/&s/g' -e '1,$s/\b[m]\([[:alpha:]_]*)\b/M\1/g' $FILE
#tr 转换命令. "tr 'ab' 'AB' 表示出现"a"就替换为"A".出现"b"就替换成"B".
例:echo "banana" | tr 'a-z' 'A-Z'
   -d 可用于删除字符 tr -d 'a'
   echo "banana" | tr -d 'a'
#"bash -n a.sh 可检查语法错误"
#"bash -x a.sh 调试执行 将整个执行过程打印出来"
#s@@@ = s /// = s AAA
#basename /etc/inittab > inittab
*********************************************************************
练习一:
1.将/etc/inittab 文件中以id开头后面跟了两个冒号间有一个
数字的那一行中的那两个冒号间的数字改为3.
 sed -n s/^id:[[:digit:]]:/id:3:/p /etc/inittab
 sed '1,$s/^id:[0-9]:/id:3:/g' /etc/inittab
2.将/etc/passwd文件中以n开头的所有词首字母改为大写:
 sed -n '1,$s/\bn/N/gp' /etc/passwd
^sed '1,$s/\bn\([[:alpha:]]*\)\b/N\1/g' /etc/passwd
3.在/proc/meminfo文件中所有以HugePages开头的行后面添加
 "# For performancing"一个新行.
 sed "/^HugePages/a\# For performancing" /proc/meminfo
 
4.删除/etc/inittab文件中所有以#开头,或者以一些空白字符后跟一个#开头的行,
 并且将所有以一个空格后跟一个数字结尾的行改为0.
 sed '/^[[:space:]]*#/d' /etc/inittab
 sed '1,$s/^[[:space:]]*#//g' /etc/inittab 仅清空匹配字符
 sed '1,$s/^[[:space:]]*#.*//g' /etc/inittab 清空行
 sed '1,$s/ [0-9]$/ 0/g' /etc/inittab
*********************************************************************
练习二,脚本:
(1).
编写脚本,将/var/目录下所有文件的文件名的首字母和尾字母显示时改为大写.
--------------------------------------------------------------------------------------------
#!/bin/bash
#
cd /var
for FILE in `ls /var`; do
  FIETTER=`echo $FILE | sed '1,$s/\([a-zA-Z]\).*/\1/g' | tr 'a-z' 'A-Z'`
  LLETTER=`echo $FILE | sed '1,$s/.*\([a-zA-Z]\)/\1/g' | tr 'a-z' 'A-Z'`
  echo $FILE | sed "s/[a-zA-Z]\(.*\)[a-zA-Z]/$FLETTER\1$LLETTER/g"
done
--------------------------------------------------------------------------------------------
(2).
1.假设某个文件有如下行
/etc/inittab
/etc/pam.d/sudo
/usr/share/doc
/usr/local/
/etc/sysconfig/
/var/log/messages
(建立文件sedfile2 输入以上内容)
2.取出如上文件中每一行文件名中不包含路径的文件名,
 比如,/etc/inittab的文件名为inittab,
      /etc/sysconfig的文件名为sysconfig
3.把每个文件名的第二个字母显示时改为大写
---------------------------------------------------------------------------------------------
#!/bin/bash
#
FILES=`sed '1,$s@.*/\([a-zA-Z]\{1,\}\)/\{0,1\}$@\1@g' sedfile2`
for FILE in $FILES; do
  SLETTER=`echo $FILE | sed '1,$s/.\([a-zA-Z]\).*/\1/g' | tr 'a-z' 'A-Z'`
  echo $FILE | sed " s@\(.\).\(.*\)@\1${SLETTER}\2@g"
done
--------------------------------------------------------------------------------------------