A Programmer’s Perspective
李鼎(oldratlee<at>gmail<dot>com)
   批处理(sed/awk) VS 交互性(vi)
     快速大量地处理文件
     可重复使用脚本
     在脚本上可逐步改进
   Plain Text(平文本) VS Binary(二进制格式)
     Unix VS Windows :’) (etc/passwd vs 注册表)
   更新多个POM文件中的工程版本
   大量文件的重复操作(替换、转换等)
1.       预备知识(glob、正则表达式)
2.       sed *
     ▪   执行流程
     ▪   语法
     ▪   实例
3.       脚本编写实践
4.       附录 & 相关资料
   wild-card pattern(glob)
     bash
     find
     --include option of grep
   Regular Expression
       grep
       sed
       awk
       vi
   http://en.wikipedia.org/wiki/Glob_(programming)
   由ed引入,在grep、sed中可用
    元字符                      用途
       .      任一字符。 # awk中可以匹配换行
       *      匹配任意个(含零个)在它前面的字符
      […]     字符类,第一个字符为脱字符^表示匹配
       ^      匹配行开始
       $      匹配行结尾
              匹配前面字符指定的次数。
    {m,n}
              {n}匹配n次,{n,}至少n次,{,n}至多m次
             转义随后的特殊字符
   由egrep引入,awk基本上与egrep相同
    元字符                  用途
      +     匹配一个或多个在它前面的字符
      ?     匹配零个或一个在它前面的字符
      |     配置前面或后面的正则(替代方案)
     ()     正则表达式分组
            匹配前面字符指定的次数。
    {m,n}
            {n}匹配n次,{m,}至少m次,{,n}至多m次
   命令
     p
     d
    s
   地址
     行号 : 1 ,59, 200
     正则表达式: /^foo[0-9]/
0 for(line : <Input File>) {
1    process line by command list
2    print pattern space
3    clean pattern/hold space
4 }

NOTE:
 2 print pattern space
  这一步可以用sed –n选项关闭
   p   打印
   s   替换
   d   删除
   a   追加 i 插入 c 修改
   =   打印行号
   n   下一条
   q   退出
   格式
     s/reg_from/reg_to/<option>
   Option
     数字,如2 表示只替换第2个匹配
     g,替换所有匹配,缺省只替换第一个匹配
   替换元字符是()、(&)、(num)
   在替换字符串中也用于包含(换行符)
    1. s/●/
       /2 #用换行符替换第2 个制表符
    2. s/.Ah */
       
       @A HEAD = /
    3. s/$/
       /
   行号地址:
     1
     20
     $ (最后一行)
   正则地址:
     /regex/
   范围: (闭区间)
     /reg_start/,/reg_end/
     1,/reg_end/
   简单命令:
    p
   地址+命令:
     1d
     $s/good/bad/g
     /from/to/s#dog#cat#
   复合命令:
     <地址>{
       <命令行>
      }
   1p
   $a/
    <EOF>
   /^include/d
   命令:p s d a i c = n y q
     P D N H h G g x
     : b t
①   词组搜索(词组可能跨两行)
②   标签替换
③   Velocity模板中get方法转成属性

④   练习一个:
    去掉换行自动换行
①   使用分号:
    sed 's/bad/good;s/dog/cat/' file
②   使用多个e选项
    sed -e ‘s/bad/good/' –e 's/dog/cat/' file
③   使用的Bash的分行指令
    sed -e 's/bad/good
    s/dog/cat/' file
   先在典型的测试数据上测运行,对比差异
    然后在实际数据上运行
   实用性
    不用用脚本完成100%的工作,人肉辅助。
   递归查看目录下的文件 –r
     grep com.alibaba.dubbo --include=*.java -r .
   只查看选定的文件:
     --include=*.java --include=*.c --include=*.{c,php}
   输出上下文行 -A -B -C –NUM
   只显示匹配的文件 –l
   彩色显示结果 --color=auto
     别名以方便使用:alias             grep='grep --color=auto'
   每行都马上flush --line-buffered
     避免buffer引起的等待
   替换递归目录下文件使用sed/awk:
    grep <pattern> -rl . | xargs sed -e <script>
a) UnixUtils有Windows下的Port
   http://unxutils.sourceforge.net/
b) GNU Win32 ports
   http://sourceforge.net/projects/gnuwin32/
c) 使用cygWin
   http://www.cygwin.com/

    详见: 如何在Windows下使用GNU命令
     http://www.oldratlee.com/297/tech/unix/use-
     unix-command-under-windows.html
   在“!#”行只能有一个参数。
    # (在Ubuntu、Redhat下我有测试过)
    这行由*nix系统内核处理,而不是由shell处
    理,因此不能有任何shell构件。
   http://zh.wikipedia.org/wiki/Shebang
    http://en.wikipedia.org/wiki/Shebang_(Unix)
   sed & awk 2nd Ed
   man page of ed, grep, sed, awk
   sed & awk Pocket Reference
   GNU sed的Manual,实现中有很多扩展
    http://www.gnu.org/software/sed/manual/html_node/index.html

sed -- A programmer's perspective

  • 1.
  • 2.
    批处理(sed/awk) VS 交互性(vi)  快速大量地处理文件  可重复使用脚本  在脚本上可逐步改进  Plain Text(平文本) VS Binary(二进制格式)  Unix VS Windows :’) (etc/passwd vs 注册表)
  • 3.
    更新多个POM文件中的工程版本  大量文件的重复操作(替换、转换等)
  • 4.
    1. 预备知识(glob、正则表达式) 2. sed * ▪ 执行流程 ▪ 语法 ▪ 实例 3. 脚本编写实践 4. 附录 & 相关资料
  • 6.
    wild-card pattern(glob)  bash  find  --include option of grep  Regular Expression  grep  sed  awk  vi  http://en.wikipedia.org/wiki/Glob_(programming)
  • 7.
    由ed引入,在grep、sed中可用 元字符 用途 . 任一字符。 # awk中可以匹配换行 * 匹配任意个(含零个)在它前面的字符 […] 字符类,第一个字符为脱字符^表示匹配 ^ 匹配行开始 $ 匹配行结尾 匹配前面字符指定的次数。 {m,n} {n}匹配n次,{n,}至少n次,{,n}至多m次 转义随后的特殊字符
  • 8.
    由egrep引入,awk基本上与egrep相同 元字符 用途 + 匹配一个或多个在它前面的字符 ? 匹配零个或一个在它前面的字符 | 配置前面或后面的正则(替代方案) () 正则表达式分组 匹配前面字符指定的次数。 {m,n} {n}匹配n次,{m,}至少m次,{,n}至多m次
  • 10.
    命令  p  d s  地址  行号 : 1 ,59, 200  正则表达式: /^foo[0-9]/
  • 12.
    0 for(line :<Input File>) { 1 process line by command list 2 print pattern space 3 clean pattern/hold space 4 } NOTE:  2 print pattern space 这一步可以用sed –n选项关闭
  • 13.
    p 打印  s 替换  d 删除  a 追加 i 插入 c 修改  = 打印行号  n 下一条  q 退出
  • 14.
    格式  s/reg_from/reg_to/<option>  Option  数字,如2 表示只替换第2个匹配  g,替换所有匹配,缺省只替换第一个匹配
  • 15.
    替换元字符是()、(&)、(num)  在替换字符串中也用于包含(换行符) 1. s/●/ /2 #用换行符替换第2 个制表符 2. s/.Ah */ @A HEAD = / 3. s/$/ /
  • 16.
    行号地址: 1 20 $ (最后一行)  正则地址: /regex/  范围: (闭区间) /reg_start/,/reg_end/ 1,/reg_end/
  • 17.
    简单命令: p  地址+命令:  1d  $s/good/bad/g  /from/to/s#dog#cat#  复合命令:  <地址>{ <命令行> }
  • 18.
    1p  $a/ <EOF>  /^include/d  命令:p s d a i c = n y q P D N H h G g x : b t
  • 19.
    词组搜索(词组可能跨两行) ② 标签替换 ③ Velocity模板中get方法转成属性 ④ 练习一个: 去掉换行自动换行
  • 20.
    使用分号: sed 's/bad/good;s/dog/cat/' file ② 使用多个e选项 sed -e ‘s/bad/good/' –e 's/dog/cat/' file ③ 使用的Bash的分行指令 sed -e 's/bad/good s/dog/cat/' file
  • 22.
    先在典型的测试数据上测运行,对比差异 然后在实际数据上运行  实用性 不用用脚本完成100%的工作,人肉辅助。
  • 23.
    递归查看目录下的文件 –r  grep com.alibaba.dubbo --include=*.java -r .  只查看选定的文件:  --include=*.java --include=*.c --include=*.{c,php}  输出上下文行 -A -B -C –NUM  只显示匹配的文件 –l  彩色显示结果 --color=auto  别名以方便使用:alias grep='grep --color=auto'  每行都马上flush --line-buffered  避免buffer引起的等待
  • 24.
    替换递归目录下文件使用sed/awk: grep <pattern> -rl . | xargs sed -e <script>
  • 25.
    a) UnixUtils有Windows下的Port http://unxutils.sourceforge.net/ b) GNU Win32 ports http://sourceforge.net/projects/gnuwin32/ c) 使用cygWin http://www.cygwin.com/  详见: 如何在Windows下使用GNU命令 http://www.oldratlee.com/297/tech/unix/use- unix-command-under-windows.html
  • 26.
    在“!#”行只能有一个参数。 # (在Ubuntu、Redhat下我有测试过) 这行由*nix系统内核处理,而不是由shell处 理,因此不能有任何shell构件。  http://zh.wikipedia.org/wiki/Shebang http://en.wikipedia.org/wiki/Shebang_(Unix)
  • 27.
    sed & awk 2nd Ed  man page of ed, grep, sed, awk  sed & awk Pocket Reference  GNU sed的Manual,实现中有很多扩展 http://www.gnu.org/software/sed/manual/html_node/index.html