sed

sed

2019-01-16  本文已影响24人  忧忧草_a195

sed是一个“非交互式的”面向字符流的编辑器,默认情况下是不会修改原文件的。

工作原理:

一行一行处理的。

当从文件中读取一行后,首先放到模式空间中对该行进行相应的处理,处理完将结果输出到屏幕上。然后继续读取下一行内容,直到所有行都读取完毕,sed结束。

语法:

sed [选项] '模式动作' 文件...

选项:

-n:       静默输出,关闭模式空间的输出,不会输出未匹配到的行 一般与p命令结合使用

-e:      允许进行多项编辑,也就是说对同一行做多次处理、. 可以做多点编辑

-e:      '动作1'  -e '动作2'  ==  '动作1;动作2'

-f:        后接sed脚本,指定执行的sed脚本(将模式动作写到文件中)

-r:       允许使用扩展正则

-i:       直接作用于原文件

-i.bak:  修改原文件之前进行备份

模式:

1. 空模式

表示所有的行都执行动作

2. 以行号作为模式

1). 单独的行号,如:1  就是处理第1行;$  处理最后一行

2). 起始行,结束行, 如:1,5    处理第1到5行

3). 起始行~步长

每隔多少行操作一次, 如:2~2 从第2行开始,每隔1行

4). 起始位置,+N

表示从起始位置开始,后面的N行都进行处理, 如:3,+5  处理3-8行

3. 以正则作为模式

1). /正则表达式/, 如:/^root/

2). /正则表达式1/,/正则表达式2/

表示从第一次匹配到正则表达式1开始到第一次匹配到正则表达式2之间的所有行, 如:/^bin/,/sh$/

动作-----处理命令:! 非: 放在命令前面表示取反

1. d    删除 delete

2. p    打印      print

3. r     读取      read

4. w    写          write

5. a    追加  在匹配的行下面插入内容            append

6. i      插入  在匹配行的上一行插入内容        insert

7. c    修改    本行替换                                  change

8. y    转换的命令,一一对应转换

9. n    处理下一行                                          next

10. q    退出,不会再向模式空间读入新的行      quit

11. s    查找替换       '模式s/旧的内容(正则表达式)/替换内容(新的内容)/[修饰符]'

       修饰符:

          g:全局替换

          n:n为数字,1-512    替换第n个匹配到的内容

          p:打印      -n

          w:把处理过的行写入到另一个文件


\u upper 大写字母

\l    lower    小写字母

将文件中所有小写字母替换成大写字母:

# sed  's/[a-z]/\u&/g'  /tmp/pass



模式空间:

用于处理文本行,最大保存8192字节

保留空间:

用于保留文本行,用来保存已经处理完的文本行,最大保存8192字节,默认有一个空行

置换命令:

h:将模式空间的内容复制到保留空间 —— 覆盖模式

H:将模式空间的内容追加到保留空间 —— 追加模式

g:将保留空间的内容复制到模式空间 —— 覆盖模式

G:将保留空间的内容追加到模式空间 —— 追加模式

x:将模式空间和保留空间中的内容进行交换 

控制流:

!    命令取反 例: 1!d 删除第一行以外的行

{}   命令组合 命令用分号分隔 {1h;G} 可以理解为 -e 参数的另一种写法

=   打印行号(输入行的号码,而非处理的次数行号) 例如: sed -n '2{=;p}' infile

n   读入下一行到模式空间 例:'4{n;d}' 删除第5行

N   追加下一行到模式空间.

P   输出多行模式空间的第一部分,直到第一个嵌入的换行符为止。在执行完脚本的最后一个命令之后,模式空间的内容自动输出。P命令经常出现在N命令之后和D命令之前。

D   删除模式空间中直到第一个换行符的内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用与模式空间剩余的内容。

这三个命令能建立一个输入. 输出循环,用来维护两行模式空间,但是一次只输出一行。

这个循环的目的是只输出模式空间的第一行,然后返回到脚本的顶端将所有的命令应用于模式空间的第二行。没有这个循环,当执行脚本中的最后一个命令时,模式空间中的这两行都将被输出。Sq

上一篇下一篇

猜你喜欢

热点阅读