sed:
sed会根据脚本命令来处理文本文件中的数据。
sed命令每次读取一行
sed命令默认不会修改源文件
sed命令默认会将结果输出到标准输出
sed默认语法:
sed [-nhVi] [-e ‘script’] [-f ‘script’] [文本文件]
sed有如下参数:
- -e:指定后面的是命令,用’'包括
- -f:从文件读取命令
- -n:不输出到控制台
- -i:会修改源文件
- -h:显示帮助
- -V:显示版本
在sed的脚本命令中,有如下动作:
- a:在新行新增字符串
- c:取代指定行的字符串
- d:删除指定字符串
- i :插入指定字符串
- p:打印指定字符串
- s:取代指定字符串
- y: 单个字符一一转换
- w:写入文件
- r : 读取文件
- q:第一次匹配结束后退出sed命令
接下来分别介绍各个动作:
a:
#语法:[address]a\content
sed '3a\this is a new line' data.txt
#在data.txt第3行后添加新行this is a new line
3 表示第三行,a 表示增加(下面),\表示换行,this is a new line 表示新增的内容,data.txt表示操作的文件
sed '3a\this is a new line\nthis is a second line' data.txt
#在data.txt第3行后添加新2行this is a new line 和 this is a second line
i:
#语法:[address]i\content
sed '3i\this is a new line' data.txt
#在data.txt第3行前添加新行this is a new line
3 表示第三行,i 表示增加(上面),\表示换行,this is a new line 表示新增的内容,data.txt表示操作的文件
s:
#语法:[address]s/pattern/replacement/flags
address表示操作的行,pattern指定需要替换的内容,replacement指定替换的新内容。
address可以为:
1. 为数字n,表示操作第n行
2. 为数字范围n,m,表示操作n~m行
3. 为数字范围n,$,表示操作n行到最后一行
4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
flags标记:
1. 为1-512之间的数字,表示要pattern出现第几次时替换
2. 为g,表示所有匹配的内容都替换
3. 为p,打印与pattern匹配的行,一般与-n选项一起配合使用
4. 为w file,将输出结构写入到file文件中
5. 为&,表示用正则表达式匹配替换
6. 为\n,匹配第n个子串
7. 为\, 转义字符
sed 's/old/new/2' data.txt
#将data.txt的每一行第2次出现的old替换成new
s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,2表示每一行第2次出现时,data.txt表示操作的文件
sed 's/old/new/g' data.txt
#将data.txt的所有出现的old替换成new
s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,data.txt表示操作的文件
sed 's/old/new/w tmp.txt' data.txt
#将data.txt中被替换过的行写入到tmp.txt,注意w前未有其他标记,故每一行只会替换第一次出现的old
s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,w tmp.txt表示写入到tmp.txt文件,data.txt表示操作的文件
sed 's/old/new/g w tmp.txt' data.txt
#将data.txt中被替换过的行写入到tmp.txt,注意有g标记,表示每一行所有匹配的old都替换成new
s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,w tmp.txt表示写入到tmp.txt文件,data.txt表示操作的文件
sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
#将/etc/passwd文件中的每一行的第一次匹配的/bin/bash替换成/bin/csh,注意对/符号要做转义\
s 表示替换动作,\/转义字符'/','/bin/bash'做转义操作为'\/bin\/bash'
sed '2s/old/new/g w tmp.txt' data.txt
#操作第2行,将data.txt中被替换过的行写入到tmp.txt,注意有g标记,表示每一行所有匹配的old都替换成new
2 表示要操作的行,s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,w tmp.txt
表示写入到tmp.txt文件,data.txt表示操作的文件
sed '2,5s/old/new/g w tmp.txt' data.txt
#操作第2行到5行,将data.txt中被替换过的行写入到tmp.txt,注意有g标记,表示每一行所有匹配的old都替换成new
2,5 表示要操作的行,s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,w tmp.txt
表示写入到tmp.txt文件,data.txt表示操作的文件
sed '2,$s/old/new/g w tmp.txt' data.txt
#操作第2行到最后一行,将data.txt中被替换过的行写入到tmp.txt,注意有g标记,表示每一行所有匹配的old都替换成new
2,$ 表示要操作的行,s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,w tmp.txt
表示写入到tmp.txt文件,data.txt表示操作的文件
sed '/root/s/old/new/g w tmp.txt' data.txt
#操作匹配root表达式的每一行,将data.txt中被替换过的行写入到tmp.txt,注意有g标记,表示每一行所有匹配的old都替换成new
/root/ 表示匹配root表达式的每一行,s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,w tmp.txt
表示写入到tmp.txt文件,data.txt表示操作的文件
d:
#语法:[address]d
address可以为:
1. 为数字n,表示操作第n行
2. 为数字范围n,m,表示操作n~m行
3. 为数字范围n,$,表示操作n行到最后一行
4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
sed '2d' data.txt
#删除data.txt中第2行
2 表示操作第2行,d表示删除,data.txt表示操作的文件
sed '2,3d' data.txt
#删除data.txt中2~3行
2,3 表示操作第2~3行,d表示删除,data.txt表示操作的文件
sed '2,$d' data.txt
#删除data.txt中第2行到最后一行
2,$表示操作第2行到最后一行,d表示删除,data.txt表示操作的文件
sed '/old/d' data.txt
#删除data.txt中匹配old表达式的每一行
/old/表示操作匹配old表达式的每一行,d表示删除,data.txt表示操作的文件
c:
#语法:[address]c\replacement
address可以为:
1. 为数字n,表示操作第n行
2. 为数字范围n,m,表示操作n~m行
3. 为数字范围n,$,表示操作n行到最后一行
4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
sed '3c\this is a replacement' data.txt
#将data.txt的第3行替换成this is a replacement
3 表示操作第3行,c表示替换动作,this is a replacement表示要替换的新内容,data.txt表示操作的文件
sed '2,3c\this is a replacement' data.txt
#将data.txt的第2~3行替换成this is a replacement,注意是2~3行所有内容一次性替换
2,3表示操作第2~3行,c表示替换动作,this is a replacement表示要替换的新内容,data.txt表示操作的文件
sed '2,$c\this is a replacement' data.txt
#将data.txt的第2行到最后一行替换成this is a replacement,注意是第2行到最后一行所有内容一次性替换
2,$ 表示操作第2行到最后一行,c表示替换动作,this is a replacement表示要替换的新内容,data.txt表示操作的文件
sed '/old/c\this is a replacement' data.txt
#将data.txt的匹配old的每一行替换成this is a replacement
/old/ 表示匹配old表达式的每一行,c表示替换动作,this is a replacement表示要替换的新内容,data.txt表示操作的文件
y:
#语法:[address]y/inchars/outchars/
address可以为:
1. 为数字n,表示操作第n行
2. 为数字范围n,m,表示操作n~m行
3. 为数字范围n,$,表示操作n行到最后一行
4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
sed 'y/123/789/' data.txt
#将data.txt中的每一行的所有的1转换成7,2转换成8,3转换成9
sed '2,3y/123/789/' data.txt
#将data.txt中的2~3行的所有的1转换成7,2转换成8,3转换成9
sed '/old/y/123/789/' data.txt
#将data.txt中的匹配old的每一行的所有的1转换成7,2转换成8,3转换成9
p:
#语法:[address]p
address可以为:
1. 为数字n,表示操作第n行
2. 为数字范围n,m,表示操作n~m行
3. 为数字范围n,$,表示操作n行到最后一行
4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
一般与-n选项一起使用
sed -n 'p' data.txt
#显示data.txt所有内容
-n 表示不输出到控制台,p表示打印缓存,data.txt表示操作的文件
sed -n '2p' data.txt
#显示data.txt第2行内容
-n 表示不输出到控制台,2表示第2行,p表示打印缓存,data.txt表示操作的文件
sed -n '2,3p' data.txt
#显示data.txt第2~3行内容
-n 表示不输出到控制台,2,3表示第2~3行,p表示打印缓存,data.txt表示操作的文件
sed -n '/old/p' data.txt
#显示data.txt匹配表达式old的每一行
-n 表示不输出到控制台,/old/表示匹配old的每一行,p表示打印缓存,data.txt表示操作的文件
w:
#语法:[address]w filename
address可以为:
1. 为数字n,表示操作第n行
2. 为数字范围n,m,表示操作n~m行
3. 为数字范围n,$,表示操作n行到最后一行
4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
sed '2w tmp.txt' data.txt
#将data.txt的第2行写入到tmp.txt文件中
2 表示要操作第2行,w表示写文件动作,tmp.txt表示写入的文件名,data.txt表示操作的文件
sed '2,3w tmp.txt' data.txt
#将data.txt的第2~3行内容写入到tmp.txt文件中
2,3 表示第2~3行,w表示写文件动作,tmp.txt表示写入的文件名,data.txt表示操作的文件
sed '/old/w tmp.txt' data.txt
#将data.txt的匹配表达式old的每一行写入到tmp.txt文件中
/old/表示匹配old的每一行,w表示写文件动作,tmp.txt表示写入的文件名,data.txt表示操作的文件
r:
#语法:[address]r filename
address可以为:
1. 为数字n,表示在第n行后操作
sed '2r tmp.txt' data.txt
#读取tmp.txt文件内容并插入到data.txt的第2行后面
2 表示在第2行后,r表示读文件动作,tmp.txt表示读取的文件名,data.txt表示操作的文件
sed '$r tmp.txt' data.txt
#读取tmp.txt文件内容并插入到data.txt的文件末尾
$ 表示在文件末尾,r表示读文件动作,tmp.txt表示读取的文件名,data.txt表示操作的文件
q:
sed -n '/root/{s/old/new/;p;q}' data.txt
#对data.txt中第一个匹配root表达式的行,将old替换成new,然后打印并退出
root表示与root表达式匹配的行,{}表示一组命令,命令用分号隔开,s/old/new/表示将一行
中第一个old替换成new,p表示打印缓存,q退出sed命令,data.txt表示操作的文件
[root@localhost lgsh]# cat data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# sed '3a\this is a new line' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
this is a new line
line 4. file end
[root@localhost lgsh]# sed '3a\this is a new line\nthis is a second line' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
this is a new line
this is a second line
line 4. file end
[root@localhost lgsh]# sed '3i\this is a new line' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
this is a new line
line 3. old old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# sed 's/old/new/2' data.txt
line 1. old new old new new new 111222333-root
line 2. old new old new new new 222-root
line 3. old new old new new new 333-admin
line 4. file end
[root@localhost lgsh]# sed 's/old/new/g' data.txt
line 1. new new new new new new 111222333-root
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
line 4. file end
[root@localhost lgsh]# sed 's/old/new/w tmp.txt' data.txt
line 1. new old old new new new 111222333-root
line 2. new old old new new new 222-root
line 3. new old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# cat tmp.txt
line 1. new old old new new new 111222333-root
line 2. new old old new new new 222-root
line 3. new old old new new new 333-admin
[root@localhost lgsh]# sed 's/old/new/g w tmp.txt' data.txt
line 1. new new new new new new 111222333-root
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
line 4. file end
[root@localhost lgsh]# cat tmp.txt
line 1. new new new new new new 111222333-root
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
[root@localhost lgsh]# sed -n '1s/\/bin\/bash/\/bin\/csh/p' /etc/passwd
root:x:0:0:root:/root:/bin/csh
[root@localhost lgsh]# sed '2s/old/new/g w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. new new new new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# cat tmp.txt
line 2. new new new new new new 222-root
[root@localhost lgsh]# sed '2,5s/old/new/g w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
line 4. file end
[root@localhost lgsh]# cat tmp.txt
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
[root@localhost lgsh]# sed '2,$s/old/new/g w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
line 4. file end
[root@localhost lgsh]# cat tmp.txt
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
[root@localhost lgsh]# sed '/root/s/old/new/g w tmp.txt' data.txt
line 1. new new new new new new 111222333-root
line 2. new new new new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# cat tmp.txt
line 1. new new new new new new 111222333-root
line 2. new new new new new new 222-root
[root@localhost lgsh]# sed '2d' data.txt
line 1. old old old new new new 111222333-root
line 3. old old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# sed '2,3d' data.txt
line 1. old old old new new new 111222333-root
line 4. file end
[root@localhost lgsh]# sed '2,$d' data.txt
line 1. old old old new new new 111222333-root
[root@localhost lgsh]# sed '/old/d' data.txt
line 4. file end
[root@localhost lgsh]# sed '3c\this is a replacement' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
this is a replacement
line 4. file end
[root@localhost lgsh]# sed '2,3c\this is a replacement' data.txt
line 1. old old old new new new 111222333-root
this is a replacement
line 4. file end
[root@localhost lgsh]# sed '2,$c\this is a replacement' data.txt
line 1. old old old new new new 111222333-root
this is a replacement
[root@localhost lgsh]# sed '/old/c\this is a replacement' data.txt
this is a replacement
this is a replacement
this is a replacement
line 4. file end
[root@localhost lgsh]# sed 'y/123/789/' data.txt
line 7. old old old new new new 777888999-root
line 8. old old old new new new 888-root
line 9. old old old new new new 999-admin
line 4. file end
[root@localhost lgsh]# sed '2,3y/123/789/' data.txt
line 1. old old old new new new 111222333-root
line 8. old old old new new new 888-root
line 9. old old old new new new 999-admin
line 4. file end
[root@localhost lgsh]# sed '/old/y/123/789/' data.txt
line 7. old old old new new new 777888999-root
line 8. old old old new new new 888-root
line 9. old old old new new new 999-admin
line 4. file end
[root@localhost lgsh]# sed -n 'p' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# sed -n '2p' data.txt
line 2. old old old new new new 222-root
[root@localhost lgsh]# sed -n '2,3p' data.txt
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
[root@localhost lgsh]# sed -n '/old/p' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
[root@localhost lgsh]# sed '2w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# cat tmp.txt
line 2. old old old new new new 222-root
[root@localhost lgsh]# sed '2,3w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# cat tmp.txt
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
[root@localhost lgsh]# sed '/old/w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# cat tmp.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
[root@localhost lgsh]# sed '2r tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 3. old old old new new new 333-admin
line 4. file end
[root@localhost lgsh]# sed '$r tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
[root@localhost lgsh]# sed -n '/root/{s/old/new/;p;q}' data.txt
line 1. new old old new new new 111222333-root
[root@localhost lgsh]#