马哥学习-----李洋个人笔记之--sed用法

Stream EDitor, 行文本编辑器
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”
(pattern space),接着用sed命令处理缓冲区中的内容,如果读入的行不符合需求,则不处理直接把内容送往屏幕,
符合需求的内容处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。

如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,

直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。没有使用w选项的话,所有的改变只保留在默认输出
上(屏幕),原文件内并不做任何改动.

功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

用法:

sed [option]... 'script' inputfile...

sed+选项+地址命令+输入文件(可以为多个),其中地址命令可以省略,直接sed+输入文件效果类似于cat。

常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印,但是后面可以跟#p来指定打印第几行

sed -n '3p' 123.txt

打印123.txt的第三行。

p: 打印 ,直接sed + 'p' + 文件的话,会把指定文件打印两次.因为sed默认就是输出,p又指定打印一次.
而sed + #p + 文件的话,则会将指定行打印2次,其余行打印一次.

-e: 多点编辑,即可以指定多个规则.

-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本

-r: 支持使用扩展正则表达式

-i.bak: 备份文件并原处编辑,只有加了i,所有的设置才会在原文件中生效.加上-i.bak后,会自动创建出
以原名件名.bak的备份文件,原文件内容被替换,但备份文件内容与被修改前一样.(.bak可以改成任意字符串)

script:'地址命令’

地址定界:

(1) 不给地址:对全文进行处理

(2) 单地址:

#: 指定的行,$:最后一行

sed 123.txt |sed 1p

打印第一行,不能用正则的^来代替第一行. 因为事先不知道一共有多少行,所以$p还能表达最后一行的意思.

/pattern/:被此处模式所能够匹配到的每一行.

cat 123.txt |sed -n /abc/p

打印123.txt当中,包括abc字符的行. 不能使用sed打开文件后,再传递给sed.

(3) 地址范围:
#,#

cat 123 |sed -n 3,5p

打印出123文件中,第三行到第五行的内容.

#,+#

cat 123 |sed -n 3,+1p 只支持加+.不支持减-.

打印出123文件中,第三行及随后的一行.

/pat1/,/pat2/

cat 123 |sed -n /who/,/which/p

打印出123文件中,从who开始,which]结尾中间的所有行数.

#,/pat1/

cat 123 |sed -n 1,/which/p

打印出123文件中,第一行到which结尾中间的所有行数.

(4) ~:步进
1~2 奇数行

seq 1 10 |sed -n 1~2p

1

3

5

7

9

2~2 偶数行

seq 1 10 |sed -n 2~2p

2

4

6

8

10

编辑命令:

p:打印当前模式空间内容,追加到默认输出之后,使用p的时候要把-n加上,否则会输出两遍。

d: 删除模式空间匹配的行,并立即启用下一轮循环

seq 1 3|sed 2d

1 3 删除指定的行数。

a []text:在指定行后面追加文本,支持使用\n实现多行追加

cat 123 | sed 2a7254891 在第二行的尾部,追加新的一行,内容为7254891.

cat 123 | sed 2a7254891\n123456

在第二行的尾部,追加新的一行,内容为7254891n123456

cat 123 | sed "2a7254891\n123456"

在第二行的尾部,追加新的二行,内容分别为7254891和123456(另起一行).

cat 123 | sed "2,3a77777"

将123文件中,第二行和第三行后面分别加上77777.

i []text:在行前面插入文本,和a相反.

c []text:替换行为单行或多行文本

cat 123 | sed "2c77777\n123"

从第二行开始,将77777替换为原来第二行的内容,并在下方追加一行123,原来的第三行变为第四行.

cat 123 | sed "2,3c77777

将123文件中的第二,第三行内容,替换为一行,内容为77777.

w /path/somefile: 保存模式匹配的行至指定文件

cat 123 |sed w/app/321

将123文件在模式空间的内容,另存为321,保存至/app目录下.

r /path/somefile:读取指定文件的文本至模式空间中

cat 123 |sed w321

将321的内容,逐行追加到123的行尾,如果有指定匹配项,则在匹配项后追加.

注意:不指定位置的话,追加方式为逐行追加(即在123的每一行下方,都追加一次全部的321内容.包括空行).

cat 123 |sed 2w321

将321文件的内容,追加到123文件的第二行尾部.

匹配到的行后
=: 为模式空间中的行打印行号

!:模式空间中匹配行取反处理

sed工具
s///:查找替换,支持使用其它分隔符,s@@@,s###

替换标记:

g: 行内全局替换 s/替换内容/g,如果想忽略大小写,可以在g后面加上i,变为s/替换内容/gi即可.
替换一行中的某一部分.
格式:sed 's/要替换的字符串/新的字符串/g' (要替换的字符串可以用正则表达式)

cat 123 |sed 's/who/i/g' 将123文本中的who,替换为i.

cat 123 |sed '1,3s/who/i/g' ,将123文本中的第一行和第三行的who替换为i.

替换匹配行中的某个字符串
格式sed -i '/匹配字符串/s/匹配字符串/替换目标字符串/g' filename

cat 123 | sed -i '/aaa/s/aaa/apple/g'

将123文件中的aaa,替换为apple

p: 显示替换成功的行

w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

例子:

sed ‘2p’ /etc/passwd

第二行打印2次,其余行打印一次.

sed –n ‘2p’ /etc/passwd

只打印第二行.

sed –n ‘1,4p’ /etc/passwd

只打印1--4行.

sed –n ‘/root/p’ /etc/passwd

只打印包含root的行.

sed –n ‘2,/root/p’ /etc/passwd

从2行开始,只打印包含root的行.

sed-n ‘/^$/=’ file

显示空行行号

sed–n–e ‘/^$/p’–e ‘/^$/=’ file

先打印所有空行,并把空行打上行号.

sed ‘/root/a\superman’ /etc/passwd行后

将/etc/passwd文件中,所有root的行后,追加一行内容为superman的行.

sed ‘/root/i\superman’ /etc/passwd 行前

将/etc/passwd文件中,所有root的行前,追加一行内容为superman的行.

sed ‘/root/c\superman’ /etc/passwd 代替行

将/etc/passwd文件中,所有root的行,替换内容为superman的行.

sed ‘/^$/d’ file

删除所有空行.

sed ‘1,10d’ file

删除第一行到第十行.

nl /etc/passwd | sed ‘2,5d’ nl会将打开的文本,自动加上行号.

删除第二到第五行

nl /etc/passwd | sed ‘2a tea’

在第二行后追加一行,内容为 tea(没有空格)

sed 's/test/mytest/g' example

将example文件当中,所有的test替换为mytest。

sed –n ‘s/root/&superman/p’ /etc/passwd 这里的&符号相当于互相引用,&引用前方的词.

将passwd文件中,root单词后方加上superman。,变为rootsuperman.

sed –n ‘s/root/superman&/p’ /etc/passwd 单词前

将passwd文件中,root单词前方加上superman。,变为supermanroot.

sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets

将pets中的dog换成cat,再将hi换成lo.

sed –i.bak ‘s/dog/cat/g’ pets

sed高级编辑.sed有模式空间(临时缓存区)及保持空间(相当于仓库).
Pattern Space相当于车间,sed把流内容在这里进行处理,Hold Space相当于仓库,加工的半成品在这里进行临时
存储基于用户希望在某个条件下脚本中的某个命令被执行,或者希望模式空间得到保存以便下一次处理都有可能使得
sed在处理文件的时候不按照正常的流程来进行,这个时候,sed设置了一些高级命令来满足用户的要求。

P:打印模式空间开端至\n内容,并追加到默认输出之前.

h: 把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

x: 把模式空间中的内容与保持空间中的内容进行互换

n: 读取匹配到的行的下一行至模式空间,用下一个命令处理新的行而不是用第一个命令

N:读取匹配到的行的下一行追加至模式空间,并在两者之间嵌入一个新行,改变当前行号.

d: 删除模式空间中的行

D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输
入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样
启动正常的新循环

sed-n 'n;p' FILE
先读入文件的第一行至模式空间,执行n命令(读取下一行并覆盖模式空间),再执行命名p(打印至屏幕)
所以最终结果是只打印了偶数行。和 sed -n 2~2p 一样了。

sed '1!G;h;$!d' FILE
!为非的意思,1!G的意思是,第一行不执行G命令,执行h命令,把模式空间的内容覆盖至保持空间,接下来执行d命令,
删除模式空间的内容,$!d的意思是,最后一行不执行删除.所以这时保持空间当中只有第一行内容。
接着第二行开始执行.读入第二行,执行G命令后,模式空间和保持空间都有第二行的内容,接下来执行h命令,把模式空间
的内容覆盖至保持空间.再开始执性d命令删除模式空间内容,这时保持空间内容为第二行及第一行.
依次类推,直到执行完后,保持空间的内容相对于原文件而言,已经是倒序了.也就是 sed '1!G;h;$!d'=tac(倒序)

sed 'N;D‘ FILE
N一次读入两行至模式空间(a行和b行),并删除上一行内容(a行),D如果当前模式空间内有换行符,则删除上一行内容,
然后使用删除后的模式空间内容(b行),接着再次读入一行(c行).再开始删除上一行(b行),再使用删除后的模式空间(c行)
读取下一行...直至读完整个文本,输出模式空间内容至屏幕上.这时只会打印最后一行.也就是sed 'N;D‘ =tail -1.

sed '$!N;$!D' FILE
$!N不是最后一行就读取两行.$!D不是最后一行就删除模式空间的上一行.直到最后一行时不再删除模式空间的上一行
并将模式空间内容打印至屏幕上,相当于只打印后两行内容.也即是sed '$!N;$!D'=tail -2

sed '$!d' FILE
不是最后一行就删除,相当于只要最后一行.也就是 sed '$!d' = sed 'N;D‘ = tail -1.

sed ‘G’ FILE
从保持空间拉取内容追加至保持空间,而最开始保持空间内容为0.相当于在原文件每行下面添加了一个空白行.

sed ‘g’ FILE
从保持空间取出数据覆盖至模式空间,而最开始保持空间内容为0.相当于原文件全被变成空白行了.(但总行数不变)

sed ‘/^$/d;G’ FILE
删除空白行,再从保持空间拉取内容追加至保持空间,而最开始保持空间内容为0.相当于在原文件每行下面添加了
一个空白行.但和直接的G不同,这个命令会将所有的空白行全部删除,只在非空白行下面追加一个空白行.

sed 'n;d' FILE
读取下一行内容至模式空间,然后执行d命令删除,相当于隔行保留.也就是 sed 'n;d' = sed -n 1~2p

sed -n '1!G;h;$p' FILE
!为非的意思,1!G的意思是,第一行不执行G命令,执行h命令,把模式空间的内容覆盖至保持空间,接下来执行p命令,
$p的意思是,最后一行打印.这时候不打印.
接着第二行开始执行.读入第二行,执行G命令后,模式空间和保持空间都有第二行的内容,接下来执行h命令,把模式空间
的内容覆盖至保持空间.再开始执行$p命令,依然不打印.这时保持空间内容是第二行,第一行。依次类推,直到执行至
最后一行全部打印.相当于倒序.也就是:sed '1!G;h;$!d'=tac(倒序) = sed -n '1!G;h;$p'

猜你喜欢

转载自blog.51cto.com/13477118/2125287
今日推荐