1 命令介绍
sed 是一种在线编辑器,它一次处理一行内容,功能同awk类似,差别在于,sed简单,对列处理的功能要差一些
默认不编辑原文件,仅对模式空间中的数据做处理。除非你使用重定向存储输出
1.1 选项和参数
sed [-nefr] [操作]
选项与参数
-n:使用安静模式,不适用-n会重复打印,比如sed -n '5,7p',不加n就会重复
-e:直接在命令行模式上进行sed的操作编辑
-f:直接将sed的操作写入文件中
-r:sed的操作为扩展正则表达式的语法
-i:直接修改读取的文件内容,修改前最后先检查
操作说明:[n1,n2] function
n1, n2 :不见得会存在,一般代表『选择进行动作的行数』
a:新增,a后面接字符为新增行内容(当前的下一行),sed '2a Hello' 在第2行下加Hello
c:替换,c后面可以接字符,直接替换当行内容
d:删除,比如sed '2,5d',删除2-5行
i:插入,当前的上一行
p:打印,比如sed -n '5,7p',打印5-7行
s:替换,比如sed 's/要被替换的字符/新的字符/g'
替换标记
g 表示行内全面替换。
p 表示打印行。
w 表示把行写入一个文件。
x 表示互换模板块中的文本和缓冲区中的文本。
y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
\\1 子串匹配标记
& 已匹配字符串标记
其它
! 表示后面的命令对所有没有被选定的行发生作用。
= 打印当前行号码。
# 把注释扩展到下一个换行符以前。
2 输出结果
以下是a.txt的文件内容
hello,world
world
Hello,hello,hello:11
HELLO
exe
eze
EXE
esssssssssss
esbc
esb
es
10.234.32.11
10A
abc
'abc
$123
123$
123sss
A123.
3214F.
1)用a参数在第二行的下面插入test11111
如果是要增加两行以上,在第二行后面加入两行字,例如『Drink tea or .....』与『drink beer?』,每一行之间都必须要以反斜杠『 \ 』来进行新行的添加
[root@www ~]# nl /etc/passwd | sed '2a Drink tea or ......\
> drink beer ?'
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
Drink tea or ......
drink beer ?
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
2)用c参数替换第二行
如果是2-5行可以用 nl a.txt | sed '2,5c test1111'
3)用d参数查找并删除,比如删除2-5行 或者 删除带hello的行
要删除第 3 到最后一行
nl /etc/passwd | sed '3,$d'
4)用s参数进行替换
单独用s参数替换文件内容只会替换该行匹配到的第一个
#s和g搭配使用可达到替换全部匹配到的效果
还可以组合参数,先找出hello这行,然后将world替换成test111
另外也可以用s用作删除。比如删除【:】符号之前的内容,nl a.txt | sed -n '/hello:/{s/^.*://g;p}'
如果要删除之后的内容用sed 's/【匹配字符串】.*$//g'
5)用p参数进行搜索和打印
单独使用p参数可以看到不仅打印出匹配‘root’的行,还把原本内容打印出来
加上-n参数后,则只要经过sed特殊处理的那行才会被列出来。
6)使用y参数进行大小写转换
7)多点编辑
一条sed命令,删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/' 1 root:x:0:0:root:/root:/bin/blueshell 2 daemon:x:1:1:daemon:/usr/sbin:/bin/sh
-e表示多点编辑,第一个编辑命令删除/etc/passwd第三行到末尾的数据,第二条命令搜索bash替换为blueshell。
8)直接修改文件内容(危险动作)
利用 sed 将 regular_express.txt 内每一行结尾若为 . 则换成 !
sed -i 's/\.$/\!/g' a.txt