一、sed
1. 语法
扩展: sed -r
语法: sed [options] 'command' in_file[s]
2.options部分
(1) -n 静默输出 (不打印默认输出,所以只输出一次)
(2) -e 给予sed多个命令的时候需要-e选项
#sed -e 's/root/haha/g' -e 's/bash/wwwww/g' passwd > passwd.bak
如果不用-e选项也可以用分号“;”把多个命令隔开。
#sed 's/haha/ro/g ; s/wwwww/kkkk/g' passwd | less
(3)-i -i后面没有扩展名的话直接修改文件,如果有扩展名,则备份源文件,产生以扩展名结尾的新文件
#sed -iback 's/root/rottt/g; s/bash/wwwww/g' passwd //选项-i后面没有空格
[root@localhost 桌面]# ls
passwd passwdback
(4) -f 当有多个要编辑的项目时,可以将编辑命令放进一个脚本里,再使用sed搭配 -f 选项执行
[root@localhost 桌面]# cat s.sed
s/bin/a/g
s/ftp/b/g
s/mail/c/g
[root@localhost 桌面]# sed -f s.sed passwd | less
3.command 部分
格式: ' [地址1,地址2] [函数] [参数(标记)] '
(1)定址的方法:
(1.1)数字定址:(行号)
1 单行
#sed -n ‘1p’ passwd ----打印第一行内容
1,3 范围 从第一行到第三行
#sed -n ‘1,3p’ passwd -----打印第一行到第三行
cat -n 1.txt | sed '3,8s/ / /' -n 加行号
2,+4 从第2行到第6行
4,~3 从第四行到下一个三的倍数行(第六行)
1~3 第一行起每间隔三行的行
奇数 1~2
偶数 0~2
$ 尾行
1! 除了第一行以外的行
(1.2)正则定址
正则使用规则:
正则必须用//包裹起来
扩展正则需要用 -r 参数或转移
范例:
#cat file.txt
.TS
Beijing,CN
.TE
Shanghai,CN
guangzhou,CN
shenyang,CN
#sed ‘/Beijing/s/CN/China/' file.txt ------定位到含有Beijing字符串的行
(1.3)数字定址和正则定址结合使用
5,/a/s/// --------从第五行开始到所有有字符a的行
/a/,5s/// -------从所有有字符a的行(第五行之前的)到第五行
/a/,/b/s/// ------从有字符a的行到有字符b的行
(2)函数(子命令):
(2.1)增删改
a 后插 -----a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
例题:在testfile文件的第四行后添加一行,在命令行提示符下输入如下命令:
sed '4a \newLine' testfile
i 前插 ------i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
sed '4i \newLine' testfile
c 取代 ------c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
sed '1,4c \newLine' testfile --用newLine取代1到4行的所有内容(换乘一行)
d 删除 ------删除行
d 删除所有的行 sed 'd' 1.txt
1d 只删除第一行 sed '1d' 1.txt
$d 使用寻址符号$,删除最后一行 sed '$d' 1.txt
/^$/d 删除空行,正则表达式必须封闭在斜杠//当中 sed '/^$/d' 1.txt ---正则表达式要放在//中
/^\.TS/,/^\.TE/d 删除以.TS开头到.TE开头的行 sed '/^\.TS/,/^\.TE/d ' 1.txt ----用多个正则表达式定位
5,$d 删除第五行到结尾所有的行
#sed '1,/^$/d' file.txt 混合使用行地址和模式地址 ----删除第一行到第一个空行之间的行
1,5! 删除除1—5行之外的行(保留1到5行)
(2.2)替换s ----与c不同(s只针对一行中的部分内容进行替换,c一次把多行的内容替换成一行内容)
语法:[address ] s/pattern /replacement /flags
(2.2.1)标志flags是:
n 可以是1-512,表示第n次出现的情况进行替换
g 全局更改
p 打印模式空间的内容
将文本内容打印三次: #sed '{p;p}' a.txt ----还有一个默认的模式空间打印输出
w file 写入到一个文件file中 了解
i 忽略大小写
[root@wing ~]# echo Aaaaba | sed -r 's/a.*/B/'
AB
[root@wing ~]# echo Aaaaba | sed -r 's/a.*/B/i'
B
s 字符串替换 s/old/new/
(2.2.2)replacement部分用下列字符会有特殊含义:
& 用正则表达式匹配的内容进行替换
例题:
把所有大写字母用括号()括起来。
# sed -r 's/[A-Z]+/(&)/g' sed.txt
\n 回调参数 后向引用 n的范围是1-9
例题:
删除文件每行的倒数第二个字符。
# sed -r 's/(.*)(.)(.)/\1\3/' 1.txt
(2.3) y字符替换
利用y字符替换来实现(小写换大写)
替换字符串
sed 'y/abc/ABC/' test.txt
tr用法-----
cat test.txt | tr a-z A-Z
(2.4)r 从文件中读入内容到指定行的后面
#sed '2r b.txt' a.txt
将b.txt文件内容读入到文件a.txt的第2行后面
(2.5){ }范例:
#cat file.txt
.TS
Beijing,CN
.TE
Shanghai,CN
guangzhou,CN
shenyang,CN
命令还可以用大括号进行分组,第一个命令可以和大括号放在同一行,但是右大括号必须自己一行
分组命令(写在文档中用#sed -f 来执行)
/^\.TS/,/^\.TE/{
s/CN/China/
s/Beijing/BJ/
}
sed '2,3{s/cn/china/;s/a/b/}' file.txt -----同一范围的两个替换可以用大括号括起来一起,中间加分号
二、sed扩展知识
1.模式空间:
初始化为空,处理完一行后会自动输出到屏幕并清除模式空间。
解释:(读入第一行内容然后和子命令进行匹配,然后执行替换等等命令,匹配完一行后没有匹配的子命令了,将处理完的内容输出到屏幕上,然后清空模式空间,再读入第二行)
2.保持空间:
初始化为一个空行,也就是默认带一个\n,处理完后不会自动清除。
3.模式空间和保持空间的置换(hHgGx)
h 把模式空间内容覆盖到保持空间中(复制)
H 把模式空间内容追加到保持空间中
g 把保持空间内容覆盖到模式空间中
G 把保持空间内容追加到模式空间中 (粘贴)
x 交换模式空间与保持空间的内容
例题:
将第一行插入到每个偶数行的后面
$ sed '1h;0~2G' a.txt
11111111
22222222
11111111
33333333
44444444
11111111
55555555
66666666
11111111
4.控制流NPD
! 命令取反 例: 1!d 删除第一行以外的行
= 打印行号(输入行的号码,而非处理的次数行号) 例如: sed -n '2{=;p}' 2.txt 打印行号并打印这一行的内容
n 读入下一行到模式空间 例:'4{n;d}' 删除第5行
N 而是追加下一行到模式空间,再把当前行和下一行同时应用后面的命令
P 输出多行模式空间的第一部分,直到第一个嵌入的换行符为止。在执行完脚本的最后一个命令之后,模式空间的内容自动输出。
D 删除模式空间中直到第一个换行符的内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用与模式空间剩余的内容。
N;P;D
删除文件倒数第二行
sed 'N;$!P;D' a.txt
删除文件最后两行
sed 'N;$!P;$!D;$d' a.txt
颠倒输出(tac的功能)
$ sed '1!G;h;$!d' 1.txt
3
2
1