$ more test.txt
Hi Tom, Tom
Hi Jerry,Jerry
Hi Barry,Barry
Hi Every one
####g表示把某行的所有匹配的字符串都被替换
$ sed "s/Jerry/Jim/g" test.txt
Hi Tom, Tom
Hi Jim,Jim
Hi Barry,Barry
Hi Every one
####没有g的时候,某行第一匹配的字符被替换
$ sed "s/Jerry/Jim/" test.txt
Hi Tom, Tom
Hi Jim,Jerry
Hi Barry,Barry
Hi Every one
####可以指定某行第二个被匹配的字符串被匹配
$ sed "s/Jerry/Jim/2" test.txt
Hi Tom, Tom
Hi Jerry,Jim
Hi Barry,Barry
Hi Every one
####如果想保存修改过的输出
sed "s/Jerry/Jim/g" test.txt > mytest.txt
$ more test.txt
This is Page 1
This is Page 2
This is Page 3
####把每行的Page n加上括号
$ sed "s/Page *[0-9]*$/(&)/" test.txt
This is (Page 1)
This is (Page 2)
This is (Page 3)
####只输出含有Jerry的行
$ sed -n "/Jerry/p" test.txt
Hi Jerry
$
####没有-n的情况下,一行行的处理,先把某行原样输出,如果这行含有Jerry,那么再输出一次
$ sed "/Jerry/p" test.txt
Hi Tom
Hi Jerry
Hi Jerry
Hi Barry
Hi Every one
$ more test.txt
Tom,hello,Tom,hello,Tom
Tom,hello,Tom,hello,Tom
Tom,hello,Tom,hello,Tom
只替换每行的第二个
$ sed 's/Tom/Lisy/2' < test.txt
Tom,hello,Lisy,hello,Tom
Tom,hello,Lisy,hello,Tom
Tom,hello,Lisy,hello,Tom
$ sed -e 's/Tom/Lisy/2' < test.txt
Tom,hello,Lisy,hello,Tom
Tom,hello,Lisy,hello,Tom
Tom,hello,Lisy,hello,Tom
$ sed -e 's/Tom/Lisy/2' test.txt
Tom,hello,Lisy,hello,Tom
Tom,hello,Lisy,hello,Tom
Tom,hello,Lisy,hello,Tom
通过给 sed 增加一个-e 选项的方式能让 sed 接受多个命令
$ sed -e 's/Tom/Barry/g' -e 's/hello/hi/g' test.txt
Barry,hi,Barry,hi,Barry
Barry,hi,Barry,hi,Barry
Barry,hi,Barry,hi,Barry
$ sed -e 's/Tom/Barry/g' -e 's/hello/hi/g' test.txt 1>mytest.txt
$ more mytest.txt
Barry,hi,Barry,hi,Barry
Barry,hi,Barry,hi,Barry
Barry,hi,Barry,hi,Barry
用 shell 命令将 test.txt 文件中第 2-3 行的第 2 个"Tom"替换成"Barry"
$ sed -e '2,3s/Tom/Barry/2' test.txt
Tom,hello,Tom,hello,Tom
Tom,hello,Barry,hello,Tom
Tom,hello,Barry,hello,Tom
####-n选项和 p 标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的 test 被替换成 mytest,就打印它
$ sed -n 's/^This/It/p' test.txt
It is Page 1
It is Page 2
It is Page 3
$
####&符号表示替换换字符串中被找到的部份。所有以 192.168.0.1 开头的行都会被替换成它自已加 localhost,变成 192.168.0.1localhost
$ cat test.txt
192.168.0.1 mypc
$
$ sed 's/^192.168.0.1/&localhost/' test.txt
192.168.0.1localhost mypc
$
####不论什么字符,紧跟着 s 命令的都被认为是新的分隔符,所以,"#"在这里是分隔符,代替了默认的"/"分隔符。表示把所有 168 替换成 172
$ sed 's#168#172#g' test.txt
192.172.0.1 mypc
$
Sed在AIX中没有-i选项,所以如果想用Sed改一个文件,那么需要两步
sed 's/db2inst1/db2inst2/' infile > tmp.$$
mv tmp.$$ infile
如果你想修改很多文件的话,需要写一个shell来做了。
perl -pi -e 's/loveable/love/g' *
这个perl命令会直接修改源文件。
nl和cat -n都可以输出一个文件的行号
nl /etc/passwd
cat -n /etc/passwd
####删除 2~5 行.
cat -n passwd | sed '2,5d'
nl passwd | sed '2,5d'
####删除第2行
nl passwd | sed '2d'
####删除第3行到最后1行
$ cat -n passwd | sed '3,$d'
1 root:!:0:0::/root:/opt/freeware/bin/bash
2 daemon:!:1:1::/etc:
$
####在第二行后(就是在第三行)加上"i am fine"字样
cat -n passwd | sed '2a i am fine'
####如果要在第二行前面
nl passwd | sed '2i i am fine'
如果是要增加两行以上,在第二行后面加入两行字,例如『hello』与『how are you』
nl passwd | sed '2a hello\
>how are you'
####将第 2-5 行的内容替换成”hahaha”
nl passwd | sed '2,5c hahaha'
####仅列出/etc/passwd 文件的 5-7 行
cat -n passwd | sed -n '5,7p'
####搜索/etc/passwd 中有关/root 关键字的行
nl /etc/passwd | sed -n '/root/p'
####删除/etc/passwd 所有包含 root 的行,其他行输出
nl passwd | sed '/root/d'
####搜索/etc/passwd,找到 root 对应的行,执行后面花括号中的一组命令
####每个命令之间用分号分隔,这里把 bash 替换为 blueshell,再输出这行:
nl /passwd | sed -n '/root/{s/bash/blueshell/;p}'
如果只替换/etc/passwd 的第一个 bash 关键字为 blueshell,就退出
nl /etc/passwd | sed -n '/bash/{s/bash/blueshell/;p;q}' 1
最后的 q 是退出。
$ ifconfig en0
en0: flags=1e084863,480
inet 9.121.56.72 netmask 0xfffffe00 broadcast 9.121.57.255
tcp_sendspace 262144 tcp_recvspace 262144 rfc1323 1
$ ifconfig en0 | grep 'inet'
inet 9.121.56.72 netmask 0xfffffe00 broadcast 9.121.57.255
$
将 IP 前面部分和后面的部分予以删除
$ ifconfig en0 | grep 'inet' |sed 's/inet//g' | sed 's/netmask.*$//g'
9.121.56.72