Upload
jerry-lee
View
1.413
Download
5
Tags:
Embed Size (px)
DESCRIPTION
introduction of sed
Citation preview
sed
A Programmer’s Perspective李鼎( oldratlee<at>gmail<dot>com)
What benefit or Why learn?
批处理 (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) vs regex 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 次
二、 sed
行编辑器 ed
命令 p d s
地址 行号 : 1 , 59 , 200 正则表达式: /^foo[0-9]/
Sed 执行流程—脉动
Sed 执行流程——程序式描述
0 for(line : <Input File>) {1 process line by command list2 print pattern space3 clean pattern/hold space4 }
NOTE: 2 print pattern space
这一步可以用 sed –n 选项关闭
基本命令
p 打印 s 替换 d 删除a 追加 i 插入 c 修改= 打印行号n 下一条q 退出
s 命令(替换)
格式 s/reg_from/reg_to/<option>
Option 数字,如 2 表示只替换第 2 个匹配 g ,替换所有匹配,缺省只替换第一个匹配
替换元字符
替换元字符是 (\) 、 (&) 、 (\num) 在替换字符串中也用于包含 ( 换行符 )
1. s/●/\/2 # 用换行符替换第 2 个制表符
2. s/\.Ah */\\@A HEAD = /
3. s/$/\/
地址
行号地址: 120$ (最后一行)
正则地址:/regex/
范围: (闭区间)/reg_start/,/reg_end/1,/reg_end/
命令行
简单命令: p
地址 + 命令: 1d $s/good/bad/g /from/to/s#dog#cat#
复合命令: < 地址 >{
< 命令行 >}
sed 第一字符集合
1p$a/\<EOF>
/^include/d 命令: p s d a i c = n y q P D N H h G g x : b t
sed 实例
① 词组搜索(词组可能跨两行)② 标签替换③ Velocity 模板中 get 方法转成属性
④ 练习一个:去掉换行自动换行
sed 在命令行上指定多个命令
① 使用分号: sed 's/bad/good;s/dog/cat/' file
② 使用多个 e 选项sed -e ‘s/bad/good/' –e 's/dog/cat/' file
③ 使用的 Bash 的分行指令sed -e 's/bad/goods/dog/cat/' file
什么情况下, (1) 用分号做不了?
三、脚本实践
一些原则
先在典型的测试数据上测运行,对比差异然后在实际数据上运行
实用性不用用脚本完成 100% 的工作,人肉辅助。
附录 grep
递归查看目录下的文件 – 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>
附录: Windows 使用 sed
a) UnixUtils 有 Windows 下的 Porthttp://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
附录: #!(shebang)
在“ !#” 行只能有一个参数。# ( 在 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