unix, sed, introduction, tutorial
原文:
Sed - An Introduction and Tutorial by Bruce Barnett
#
# 基本使用方式:
#
1. 处理stdout或者stderr:
echo <something you want to print> | sed 's/<reg-pattern>/<replacement>/'
2. 处理文件:
sed 's/<reg-pattern>/<replacement>/' <old >new
s substitute
<reg-pattern> regular expression search pattern
<repalcement> the replacing string you want to use
/ is the delimiter, seems every char except '&' following the 's' could be a delimiter
#
# 在<replacement>中使用 '&' 代替已匹配到的字符
#
sed 's/abc/(abc)/' <old >new
# 可以使用下边的语句替换s上边的语句
sed 's/abc/(&)/' <old >new
# '&'可以多次使用
# 注意这里[0-9]出现了两次,这是因为sed这类基本工具只能支持基本正则表达式
# 所谓基本正则表达式是不支持'+'这类修饰符的
# 目前貌似只有awk,nawk和egrep支持扩展正则表达式
echo "123 abc" | sed 's/[0-9][0-9]*/& &/'
#
# 使用\<num>s实现反向引用,这里的<num>可以是1~9的数字
#
echo abcd123 | sed 's/\([a-z\]*\).*/\1/'
# \([a-z]*\) 是一个t通过'\('和'\)'定义的组.可以通过\<num>反向引用已经匹配到的组
# 交换第一次和第二次匹配到的结果
sed 's/\([a-z]*\) \([a-z]*\)/\2 \1/'
# 重复[a-z]以实现至少有一个字母匹配的效果
sed 's/\([a-z][a-z]*\) \([a-z][a-z]*\)/\2 \1/'
# 反向引用表达式可以在<reg-pattern>和<replacement>中使用
# 下边这个表达式可以消除两个连续的以空格分隔的重复的词
sed 's/\([a-z]*\) \1/\1/'
# 找出并显示连续的以空格相隔的词
# -n 会抑制打印pattern space(下边会有提到), 末尾的p用于显示当前(匹配?)的pattern space
# 具体信息可以参考man sed. 这里的pattern space概念不是很清晰,只找到了一篇文章有较多的提到
# 大致意思应该是待匹配的字符空间(串): http://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html
sed -n '/\([a-z][a-z]*\) \1/p'
# 交换头三个字母的次序
sed 's/^\(.\)\(.\)\(.\)/\3\2\1/'
#
# 替换标识
#
# 所谓替换标识就是最有一个分隔符后边的那个字母,如上边例子里的p
# 替换标识用于控制当一行字符串中存在多个匹配点时下一步的具体行为
# /g 用于指示替换所有的匹配
# [^ ]中的^代表'非',这个表达式将匹配所有非空格的字符(就是一个英文单词)
# 然后用()包裹匹配到的单词并输出
sed 's/[^ ][^ ]*/(&)/g'
# /<num>用于指示要替换的匹配(的序号),num可以是1~512的数字
# 下边的表达式后最后的/2表示要替换第二个匹配,而/2左边紧邻的/是替换表达式的开始分隔符
# 因为两个/之间没有字符,就表示用空串替换,就是删除的意思啦
sed 's/[a-zA-Z]* //2'
# 默认情况下sed会打印所有的待匹配行,如果该行发生了替换那么久打印替换后的行
# 如果你使用了-n参数,sed会关闭该自动打印功能。此时如果再使用/p标识就可以实现只打印
# 被修改行的(处理后的)效果
# 下边的例子将只显示发生PATTERN替换的行,其作用相当于grep
sed -n 's/PATTERN/&/p' file
# /w 用于将结果输出到一个文件
# 将file中以偶数开头的行输出到一个叫even的文件
sed -n 's/^[0-9]*[02468] /&/w even' <file
# 替换标识可以像其他unix命令参数一样组合使用
sed -n 's/a/A/2pw /tmp/file' <old >new
#
# 其它
#
# -e参数可以让你同时使用多个表达式:
sed -e 's/a/A/' -e 's/b/B/' <old >new
# 如果有多个输入参数,那这些参数就应该是文件名:
# sed首先把#开头的行全部替换成空行
# grep -v '^$'过滤掉空行
# 最后Wc -l统计出所有非空行的总数
# OK,这就是一个简单的代码统计工具啦
sed 's/^#.*//' f1 f2 f3 | grep -v '^$' | wc -l
# 行范围的限定,只替换1到100行的内容
sed '1,100 s/A/a/'
# !!!这个非常有用!!!
# 去除路径里的相对路径符'..'
# 这里的关键在于最前边的':1'和最后边的';t 1'
# :1标示了下边的脚本的Label为1,而后边的;t 1就是当之前的脚本发生替换后重新跳转
# 到label 1,知道没有替换发生。就是一个循环啦!
echo c:/mingw/lib/../lib/gcc/mingw32/4.5.2/../../../../mingw32/include | sed ':1;s,/[^/.][^/]*/\.\./,/,;t 1'
# 上边的例子中如果没有使用;t命令则只能去除第一个'/lib/../lib'
# 在mingw环境中有可能出现Windows路径分隔符'\',此时只要多加一级过滤就OK:
sed -e 's,\\,/,g' -e ':1;s,[/\][^/.][^/]*/\.\.[/\],/,;t 1'
更多的关于各命令的介绍强烈推荐这
酷壳这一篇
分享到:
相关推荐
美国医院流行病学会和感染性疾病协会成人艰难梭菌感染临床指南(2021)摘译整理.pdf
《2017年美国胃肠病学会临床实践更新委员会:重症酒精性肝炎的医疗管理》摘译.rar
《2017年美国胃肠病学会临床实践更新委员会:重症酒精性肝炎的医疗管理》摘译.pdf
摘译 (1982年)
VS Code MSDN手册的翻译稿。这是第一部分----安装和使用。后续部分正在翻译中。 有注释,带书签,主要针对:Windows环境/通用部分/Python部分进行了翻译。 该文件“……01.……”是其中的第一部分
-----------------------------------------------------------------------------------------------------------------------------本文摘译自Wired.com(Wired杂志网络版)的执行主编LeanderKahney于今年上半年...
美国国家紧急事务管理局编,译言摘译。 地震自救救人必备
本拆卸教程针对T400和R400的ThinkPad机型...教程摘译自Lenovo官方《ThinkPad T400 and R400 Hardware Maintenance Manual》,主要考虑到大家可能关心的是各部件如何拆卸,对官方硬件维护手册中的其他内容并不会太在意。
intel 80x86保护模式,中文版 80x86保护运行模式 摘译自《Intel 80386 Programmer's Reference Manual》
一篇重要的理论文章,能读懂此文对开发软件等具体工作会有极大帮助。但是文档是英文的,要求有英文基础。如果有人乐意翻译、编译或摘译都请通知我一下。
在twitter上发现了这篇文章, 简单的摘译了一下:总是从ID选择器开始继承 在class前使用tag 将jquery对象缓存起来 掌握强大的链式操作 使用子查询 对直接的DOM操作进行限制 冒泡 消除无效查询 推迟到 $(window).load ...
数据库实时备份的需求很常见,MySQL本身提供了 Replication 机制,摘译官方介绍如下: MySQL Replication 可以将一个主数据库中的数据同步到一个或多个从数据库中。并且这个同步过程默认以异步方式工作,不需要保持...
BillChiles(Roslyn编译器的程序经理)写了一篇文章《EssentialPerformanceFactsand.NETFrameworkTips》,知名博主寒江独钓对该文进行了摘译,文中分享了性能优化的一些建议和思考,比如不要过早优化、好工具很重要、...
苏马里奥 Reservado para o Sumario。 将OWASP Web安全测试指南的4.2版翻译成葡萄牙语。 从原文摘译自的原始英语版本。
下面是对原文的摘译。最近,我做了一个梦,我请海明威和其他四位文学名人替我编写JavaScript代码,一个函数返回一个给定长度的斐波纳契数列。有趣地是,他们每个人都以不同的方式完成了这一题,并且都做的很好——...
其实除了前10本之外,推荐数前30左右的书籍都算经典,笔者整理编译这个问答贴,同时摘译部分推荐人的评语。 下面就按照各本书的推荐数排列。 1、《代码大全》 史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的...
一个合格的程序员应该读过哪些书?“如果能时光倒流,回到过去,作为一个... 其实除了前10本之外,推荐数前30左右的书籍都算经典,笔者整理编译这个问答贴,同时摘译部分推荐人的评语。 下面就按照各本书的推荐数
1967年2月6~7日,苏修科学院在莫斯科举行了年会,在苏修科学院院长凯耳迪什的开幕词及主席团秘书彼维的报告中,都谈到了苏修1966年在激光领域中的进展。现将有关部分摘译如下。