实验文件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
当使用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
定位到某一行直接输入数字。超过范围时显示 ?
字母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的默认当前行)。