Fork me on GitHub

Linux行编辑器——ed

实验文件test.txt内容

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:998:997:User for polkitd:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
chrony:x:997:995::/var/lib/chrony:/sbin/nologin
lfs:x:1000:1000::/home/lfs:/bin/bash
View Code

当使用ed打开文件时,它显示了文件中的字符个数并定位在最后一行。

[root@localhost ~]# ed test.txt 
1045

没有提示符。如果输入了ed不理解的命令,它将打印一个问号作为错误消息。可以输入打印命令p来显示当前的行。

[root@localhost ~]# ed test.txt 
1045
wangyan
?
p
lfs:x:1000:1000::/home/lfs:/bin/bash
View Code

定位到某一行直接输入数字。超过范围时显示 ?

字母d 可以删除当前行。1d就是定位到1行并删除1行

除了实验数字定位某一行,还可以使用正则表达式。/regular/定位到包含regular的行。 /regular/d 定位到指定行并删除那一行,那一行的下一行成为当前行。但是这种删除方法只能删除整个文件自上到下第一次出现regular的行,要想删除所有包含regular的行,使用g/regular/d 

ed中的替换指令s

  [address]s/pattern/replacement/flag

[address]标记地址的方法就像前面介绍的那样,可以是数字,也可以是真正表达式。

flag 如果是针对一行中首次命中就不写,如果是一行中所有命中就有g

绿色字体字体这种格式仅仅是针对一行,要想匹配所有行需要在最左边加g

例子:

①s/regular/complex/   #用“complex”取代当前行上首次出现的“regular”。由于没有指定地址,所以它只影响当前行上的第一次出现。
②s/regular/complex/g  #对于①,如果在当前行上没有找到“regular”则出现一个错误。为了寻找同一行上的多次出现,必须指定g作为标志
③/regular/s/regular/complex/g  #与②一样,只是地址不再是当前行而是自上到下包含regular的首行
④g/regular/regular/complex/g  #比③范围扩大了,整个文档包含regular的行都执行

对于③④,地址和模式都是使用了正则表达式,这两者可以不一样,例如 g/regular expression/s/regular/complex/g

如果地址和模式相同,可以指定//l来告诉ed。 例如 g/regular/s//complex/g

 grep来源于ed中的下面的全局命令:

  g/re/p

ed也支持脚本化编辑。把命令单独放在文件中,然后文件作为ed的输入。格式如下:

ed test < ed-script

ed不是面向字符流的,并且文件本身会发生改变。ed脚本必须包含保存文件并退出编辑器的命令。它不产生到达屏幕的输出,但由特殊命令生成的东西除外。在ed中没有指定地址的命令只影响当前行。

对于如下命令

s/regular/complex/

①在ed中交互式地输入这个命令,则用“complex”取代当前行上第一次出现的“regular”。

②在ed脚本中,如果这是脚本中的第一个命令,那么它就只应用于文件的最后一行(ed的默认当前行)。

 

posted @ 2018-06-14 17:00  克拉默与矩阵  阅读(1278)  评论(0编辑  收藏  举报