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行,每行数字与单词靠空格分隔。

基础用法手册

你可以直接跳过这一段去看后头的例子部分,如果有不明白的,回来在手册中寻找用法。

一. 基础概念

  1. 标准sed格式:
sed -option 'position + action' file1 file2 ...-option ------script------- --files-------- 

这里script支持用分号 ; 分隔两段不同的脚本命令。他们针对同一个模式空间和保持空间操作。

  1. 两个基础概念:
    保持空间(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中的内容。

命令功能例子
aappend,指定行后面追加文本7,13
c替换单行或者多行文本15
d or Ddelete,删除Pattern Space匹配的行 or 删到第一个换行符,立即启用下一轮循环5,15
iinsert,指定行前面插入文本7,13
p or Pprint,打印Pattern Space中的全部行or到第一个换行符,若原已有打印输出,逐行追加到原打印之后。3
r or Rread,读取指定文件的全部or单行,至匹配行后。21
w or Wwrite,写入匹配行到指定的文件。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)至PATTERN23
xHOLD和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流处理本身是按行从上至下的,因此在匹配的先后顺序上,并不见得尽如人意!这点一定要知道!


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部