sed一篇入魂——实例应用学习Linux sed命令
sed: a stream editor。 和awk一样,
我们建立两个文件:my和me,本博文将都使用这两个原始文件:
> cat my
1 one
2 two
3 three
4 four
5 five
>
> cat me
yahaha
文件一共5行,每行数字与单词靠空格分隔。
基础用法手册
你可以直接跳过这一段去看后头的例子部分,如果有不明白的,回来在手册中寻找用法。
一. 基础概念
- 标准sed格式:
sed -option 'position + action' file1 file2 ...-option ------script------- --files--------
这里script支持用分号 ; 分隔两段不同的脚本命令。他们针对同一个模式空间和保持空间操作。
- 两个基础概念:
保持空间(Hold Space,下文简写为HOLD)和模式空间(Pattern Space,PATTERN)
这两个空间,可以理解成sed处理过程中的两个缓冲区。
PATTERN,缓存根据地址和正则匹配的所有行内容。可以理解为操作区。
HOLD暂存一些待用户定义的存储内容。可以理解为暂存仓库。
二. 常用选项
> sed --help 下面列出的不是所有的选项!只列出了常用的!#屏蔽屏幕上输出 (参考例子1)-n, --quiet, --silent#suppress automatic printing of pattern space#多点脚本传入 (参考例子2)-e script, --expression=script#add the script to the commands to be executed#支持正则匹配 (参考例子3)-E, -r, --regexp-extended#use extended regular expressions in the script#从script-file传入脚本 (参考例子4)-f script-file, --file=script-file#add the contents of script-file to the commands to be executed#保存更改到传入文件,根据可选的[SUFFIX]决定是否备份修改前文件-i[SUFFIX], --in-place[=SUFFIX]#edit files in place (makes backup if SUFFIX supplied)>
三. 地址位置表达
| 地址 | 功能 | 例子 |
|---|---|---|
| 没地址,默认对全文处理 | 0 | |
| N | 单地址,输入一个正整数,表示行号 | 2 |
| $ | 单地址,最后一行,不支持和其他符号一同组合使用 | 2,5 |
| /regx/ | 范围地址,满足正则匹配 | 9,11 |
| from, to | 范围地址,所有匹配行数n,满足from ≤ n ≤ to,是包含双边界的 | 1,5 |
| /reg1/, /reg2/ | 范围地址,所有匹配行数n,从reg1满足匹配到reg2满足 | 9,11 |
| first~step | 范围地址,从first行开始,以step为间隔输出匹配行 | 10 |
| source, +n | 范围地址, 输出source行及之后的n行(一共n+1行) | 11 |
四. 基础动作命令(模式空间)
命令分大写和小写,区别在于大写往往只处理PATTERN空间内容到换行符\n,小写处理全部PATTERN中的内容。
| 命令 | 功能 | 例子 |
|---|---|---|
| a | append,指定行后面追加文本 | 7,13 |
| c | 替换单行或者多行文本 | 15 |
| d or D | delete,删除Pattern Space匹配的行 or 删到第一个换行符,立即启用下一轮循环 | 5,15 |
| i | insert,指定行前面插入文本 | 7,13 |
| p or P | print,打印Pattern Space中的全部行or到第一个换行符,若原已有打印输出,逐行追加到原打印之后。 | 3 |
| r or R | read,读取指定文件的全部or单行,至匹配行后。 | 21 |
| w or W | write,写入匹配行到指定的文件。 | 22 |
| s/srcRegx/target/g | 查找替换,支持其他分隔符#@等,将符合前面字符模式的部分替换为后面的对应字符串。 | 17,18 |
| y/xxx/###/ | 将前面字符集中的单个字符替换成后面字符集中的对应单字符 | 16 |
| = | 为Pattern Space中的行打印行号 | 6 |
| ! | Pattern Space匹配行取反处理 | 12 |
五. 高级编辑命令(保持空间)
高级编辑命令分大写和小写,区别在于大写表示追加,小写表示覆盖。
| 命令 | 功能 | 例子 |
|---|---|---|
| h or H | 把PATTERN中的内容覆盖(h) or 追加(H)到HOLD中 | 23 |
| g or G | 从HOLD取出数据覆盖(g) or 追加(G)至PATTERN | 23 |
| x | HOLD和PATTERN中内容互换 | 24 |
| n or N | 读取匹配行的下一行,覆盖(n) or 追加(N)到模式空间 | 24 |
| # |
用法例子
0. 基础输出 — ‘’
我们先需要了解sed的基础输出包含哪些内容。sed命令会在控制台顺序输出参数文件内容, 值得注意的是,这种输出并没有根据两个文件的不同对输出流进行分割
> sed '' my me
1 one
2 two
3 three
4 four
5 five
yahaha
> #5 five那行和yahaha这行并没有分隔,输出拼接了起来
1. 屏蔽原文件的屏幕输出 — -n
-n参数的基础功能很好理解,不会在屏幕上输出原文件
> sed -n '' my
>
我们看下面这个例子,引号内命令部分很好理解,输出文件my中 2~4行的所有行内容。重点是这个例子帮助理解了sed是按行依次处理的。
> sed '2,4p' my
1 one
2 two
2 two
3 three
3 three
4 four
4 four
5 five
> #不屏蔽原文件输出,会在匹配的行上输出两次
> sed -n '2,4p' my
2 two
3 three
> #屏蔽原文件输出,仅仅输出匹配的行
p命令和-n参数是一对好基友,只显示你要的匹配部分的输出。
2. 执行多条命令 — -e
-e可以同时支持传入多组命令,它和在同一命令中用分号隔开是等价的,但是不完全一致,准确地说,-e要更强大和好用一些。
-e 指令和分号隔开的指令,虽然确实会按序执行,但是因为sed流处理本身是按行从上至下的,因此在匹配的先后顺序上,并不见得尽如人意!这点一定要知道!
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
