sed 流编辑器
流编辑器不同于交互式编辑器,处理前要事先确定数据匹配方式和执行的命令。即在处理前要先提供规则
格式:
sed [option] '[address]{command}' [filename]
如:
[root@t176 script]# sed -n '/^r/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
执行多条命令:
方法一:加 -e 参数
echo "The triger cubs will meet on Tuesday ater school" |
sed -e 's/triger/wolf/' -e 's/ater/berfore/'
The wolf cubs will meet on Tuesday berfore school
方法二:命令用分号分隔
echo "The triger cubs will meet on Tuesday after school" |
sed 's/triger/wolf/;s/after/before/'
The wolf cubs will meet on Tuesday before school
sed 地址表示:
1、行的数值范围 1、2、3 2,4
2、匹配模式
/mode/
例:显示以a开头的用户
sed -n '/^a/p' /etc/passwd
sed 工作时,可以将处理命令写到一个文件中
1、设计一个命令文件
cat sed.ctl
s/root/abc/
s/nologin/bash/
s/sbin/bin/
2、在执行加-f 参数指定命令文件的路径
sed -f sed.ctl /etc/passwd
s 替换命令
格式:s/pattern/replacement/flags
flags:
n 第n次出现时替换
g 全局替换(默认换第一个)
p 打印被替换的那一行,通常与-n 连用
w 将替换的结果写到另一个文件
ex:替换第一行的所有空格
sed -i '1s/ //g' file.txt
替换特殊字符要转义
d 删除命令
格式:address/d
1/d
10,20/d
/^a/d
i 插入
格式:address i\char
sed '3i\aaa' 1.txt
a 追加
格式: address a\char
sed '3a\aaa' 1.txt
c 修改行
格式:address c\char
y 变换命令
格式:address y/old_char/new_char/
例:写一个加密程序,a-c b-d c-e d-f ...
[root@t176 sed]# cat 2.txt
my password is uplooking
[root@t176 sed]# sed '1y/abcdefghijklmnopqrstuvwxyz/
cdefghijklmnopqrstuvwxyzab/' 2.txt
oa rcuuyqtf ku wrnqqmkpi
o 打印文本
= 打印行号
l 显示不可打印的字符
sed -n '1,10p' /etc/passwd 逗号是范围
打印1到10行
sed -n '/^r/p' /etc/passwd 打印以r开头的字符
w 写文件
格式: address w file_name
sed -n '/r/w /root/Desktop/1.txt' /etc/passwd
将包含r的行写入文件中
r 读文件
读到当前
address r file_name
sed '3r t2.txt' 1.txt
sed '/oper/r'
&的用法,将一串字符添加到已有字符的前面
sed -i 's/abc/ffff&/g' ./test
将ffff添加到abc前面,并且写回原文件。
==================================================
添加一个精确匹配的问题
假如文件里有单词route,同时又存在routes,如何才能只找到route呢
sed -n '/\<route\>/p' test.txt
12.6--增加一个整行替换的问题
加入你的句子里有一个单词work需要替换该词级后面所有的内容,且需要从shell传一个参数进来替换:
注意是双引号
sed -i "s/work.*/g" test.txt
12.7--增加一个二进制内容替换或删除的问题
如果你要编辑的文件中有二进制字符,比如^@或者是^E这种东西怎么办呢,其实他们是有对应的ASCII码的。
用vim打开你的文件,将光标移到二进制字符上面按ga可以查看他的二进制字符
sed -i '/\x00/d' test 就将test文件中,含有ASCII码为0的的行删除了,如果是替换为空呢
sed -i's/\x00//g' test