sed
sed介绍
sed是一个gnu项目,a stream editor, 官网http://www.gnu.org/software/sed/manual/sed.html sed是一个非常强大的文本处理工具,是linuxer经常用到的工具。
sed使用
使用方式
|
|
工作方式
可以看官方文档http://www.gnu.org/software/sed/manual/sed.html#Execution-Cycle sed在开始执行前维护了模式空间(pattern space)和辅助空间(auxiliary hold space) sed是行编辑器,所以对每一行执行script,执行之前通过address确认是否执行 执行完如果不加-n参数会把模式空间的结果输出到output stream
开始使用
命令CLI
|
|
sed的scripts
sed的命令通常是这样, sed [addr]X[options],
这里的X通常就是一个单字母 addr是匹配的行地址
追加
|
|
替换
|
|
退出
这里其实相当于head
|
|
翻译
类似tr
|
|
读文件
|
|
address
如何选择位置,想下vim,目测和vim类似
行匹配
n指定行 a,b执行a到b行, a,+1p a,-1pa和a后面的一行 类似grep -A1和grep -B1
|
|
不写,就是全局匹配
正则匹配
|
|
反条件匹配
|
|
regular expressions 正则表达式
无论任何编辑器,熟练使用正则表达式才能更加快速准确匹配自己想要的结果,不要急,因为正则非常方便在linux上测试 sed官方文档也有相关说明http://www.gnu.org/software/sed/manual/sed.html#Regular-Expressions-Overview 英文感冒的可以看看菜鸟教程https://www.runoob.com/regexp/regexp-tutorial.html 这里把里面的内容简要说下 正则通过一些字符来匹配想要的内容
- char
就是一个字典字符串
表示前面匹配的0个或者多个次
|
|
- .
匹配任意单个字母
- ^
以跟着后面的开头
|
|
- $
和^相对,标识结尾
|
|
- [list] [^list]
标识一组字符串,在或者不在
|
|
- \+
一个以上
|
|
- \?
可有可无的
|
|
- \{a,b\}
匹配a到b次,所以?是\{0,1},\+是\{1,}, *是\{0,\}
- \(regexp\)
捕获,捕获的用途主要如下
- 把捕获的东西当成一个整体
- 反向引用back references
- regexp1 | regexp2
或
一些例子
|
|
双中括号标记字符串组合
|
|
正则表达式扩展regular expression extensions
\w 单词 \W 非单词 \b 单词边界 \< 单词左边 \>单词右边
|
|
\` 模式空间开头 \'模式空间结尾 \s 匹配空白 § 匹配非空白
多行匹配
多行匹配是sed比较重要的内容,通过D, G, H, N, P来控制多行匹配,他们分别是什么意思呢 了解之前还是需要明白,sed保留有两个空间,一个模式空间pattern space, 一个辅助的保留空间hold space, 这两个空间默认都是空的
|
|
|
|
官方同样列出针对段落的匹配方式
|
|
|
|
看到这里知道为啥sed可以出一个orelly的书了吧。
分支控制
- d
删掉模式空间内容,然后直接继续cycle,不执行其他命令,也不打印
- D
删除所有,只保留最后一行,然后继续cycle,不执行其他命令,也不打印
- [addr]X
最常见的
- [addr]{ X ; X ; X}
- [regexp] { X ; X ; X}
- b
branch unconditionally (that is: always jump to a label, skipping or repeating other commands, without restarting a new cycle). Combined with an address, the branch can be conditionally executed on matched lines.
- t
branch conditionally (that is: jump to a label) only if a s/// command has succeeded since the last input line was read or another conditional branch was taken.
- T
similar but opposite to the t command: branch only if there has been no successful substitutions since the last input line was read.
|
|
继续看官方的例子
|
|
总结下,n和N
- n和N都是对下一行处理的多行控制单元
- n是把下一行打印并清空模式空间,所以例子是一次打印下一,下二,下三,模式空间没有\n
- N是把下一行追加到当前模式空间,但不打印,最后由于没有下一行,最终打印了, N可以用于两行匹配替换的情况, 模式空间会有并行的\n
总结
- sed对于我们来说,优先掌握正则表达式和常用的替换s,打印等
- 了解sed的工作方式,通过地址+script加两个空间构成
- 了解sed从–debug开始
- 对于多行处理,比如对并行(N)和段落'/./{H ; $!d} ; x ; s/regexp/replacement'、分支b等类似也建议了解下,多行处理的时候比较方便,目前看仍然需要进一步学习下
- 再看一眼sed
|
|