Linux sed 命令是利用脚本来处理文本文件。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。
1、实例
在testfile文件的第四行后添加一行,并将结果输出到标准输出,在命令行提示符下输入如下命令:
sed -e 4a\newLine testfile
2、使用sed命令后,输出结果如下:
$ sed -e 4a\newline testfile #使用sed 在第四行后添加新字符串
HELLO LINUX! #testfile文件原有的内容
Linux is a free unix-type opterating system.
This is a linux testfile!
Linux test
newline 。
3、以行为单位的新增/删除
将 /etc/passwd 的内容列出并且列印行号,同时,请将第 2~5 行删除!
[root@www ~]# nl /etc/passwd | sed -e ‘2,5d’
1 root❌0:0:root:/root:/bin/bash
6 sync❌5:0:sync:/sbin:/bin/sync
7 shutdown❌6:0:shutdown:/sbin:/sbin/shutdown
…(后面省略)…
只要删除第 2 行
nl /etc/passwd | sed ‘2d’
要删除第 3 到最后一行
nl /etc/passwd | sed ‘3,$d’
注:sed 后面接的动作,请务必以两个单引号括住喔!
4、在第二行后(亦即是加在第三行)加上『drink tea?』字样!
(1)[root@www ~]# nl /etc/passwd | sed ‘2a drink tea’
1 root❌0:0:root:/root:/bin/bash
2 bin❌1:1:bin:/bin:/sbin/nologin
drink tea
3 daemon❌2:2:daemon:/sbin:/sbin/nologin
(2)那如果是要在第二行前
nl /etc/passwd | sed ‘2i drink tea’
如果是要增加两行以上,在第二行后面加入两行字,例如 Drink tea or … 与 drink beer?
[root@www ~]# nl /etc/passwd | sed '2a Drink tea or …\
drink beer ?’
1 root❌0:0:root:/root:/bin/bash
2 bin❌1:1:bin:/bin:/sbin/nologin
Drink tea or …
drink beer ?
3 daemon❌2:2:daemon:/sbin:/sbin/nologin
注:每一行之间都必须要以反斜杠『 \ 』来进行新行的添加喔!所以,上面的例子中,我们可以发现在第一行的最后面就有 \ 存在。
5、仅列出 /etc/passwd 文件内的第 5-7 行
[root@www ~]# nl /etc/passwd | sed -n ‘5,7p’
6、搜索 /etc/passwd有root关键字的行
nl /etc/passwd | sed ‘/root/p’
7、删除/etc/passwd所有包含root的行,其他行输出:
nl /etc/passwd | sed ‘/root/d’
2 daemon❌1:1:daemon:/usr/sbin:/bin/sh
3 bin❌2:2:bin:/bin:/bin/sh
…下面忽略
#第一行的匹配root已经删除了
8、通过sed命令直接修改文件内容
sed -i ‘s/abc/xxx/g’ file
abc修改前的字符串
xxx是修改后的字符串
file是要被修改的文件(真正修改时需注意,加i直接改,不加i就是直接显示所需要的)
sed -i “s/zhangsan/lisi/g” grep zhangsan -rl /modules
-i 表示inplace edit,就地修改文件
-r 表示搜索子目录
-l 表示输出匹配的文件名
1)sed ‘y/1234567890/ABCDEFGHIJ/’ test_sed
sed ‘y/1234567890/ABCDEFGHIJ/’ filename
ABCDEFGHIJ
BCDEFGHIJA
CDEFGHIJAB
DEFGHIJABC
注意变换关系是按两个list的位置对应变换
其中:test_sed的内容是:
1234567890
2345678901
3456789012
4567890123
(2)替换每行所有匹配
sed ‘s/01/Ab/g’ test_sed
1234567890
23456789Ab
3456789Ab2
456789Ab23
注意:第一行的0,1没有分别替换为A,b
$ sed ‘2d’ example(文件)-----删除example文件的第二行。
$ sed ‘2,$d’ example-----删除example文件的第二行到末尾所有行。
$ sed ‘$d’ example-----删除example文件的最后一行。
$ sed '/test/'d example-----删除example文件所有包含test的行。
$ sed ‘s/test/mytest/g’ example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
$ sed -n ‘s/^test/mytest/p’ example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
$ sed ‘s/^192.168.0.1/&localhost/’ example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。
$ sed -n ‘s/loveloveable/\1rs/p’ example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
$ sed ‘s#10#100#g’ example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
$ sed -n ‘/test/,/check/p’ example-----所有在模板test和check所确定的范围内的行都被打印。
$ sed -n ‘5,/^test/p’ example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
$ sed ‘/test/,/check/s/$/sed test/’ example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
$ sed -e ‘1,5d’ -e ‘s/test/check/’ example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
$ sed --expression=‘s/test/check/’ --expression=’/love/d’ example-----一个比-e更好的命令是–expression。它能给sed表达式赋值。
$ sed ‘/test/r file’ example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
$ sed -n ‘/test/w file’ example-----在example中所有包含test的行都被写入file里。
$ sed ‘/^test/a\—>this is a example’ example<-----'this is a example’被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。