shell sed详解
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
shell编程之sed
一 工作原理
sed是一种流编辑器它是文本处理中非常有用的工具能够完美的配合正则表达式使用处理时把当前处理的行存储在临时缓冲区中称为模式空间接着用sed命令处理缓冲区中的内容处理完成后把缓冲区的内容送往屏幕。接着处理下一行这样不断重复直到文件末尾。文件内容并没有改变。
按行处理
sed的特点
1sed命令是将一系列的编辑命令应用于一批文本的理想工具。
2sed命令是一个非交互式的文本编辑器它可以对来自文本文件以及标准输入的文
本进行编辑。其中标准输入可以是来自键盘、文件重定向、字符串、变量或者
是管道的文本。
3sed命令会从文件或者标准输入中一次读取一行数据将其复制到缓冲区最
多8192字节然后读取命令行或者脚本的编辑子命令对缓冲区中的文本行
进行编辑。重复此过程一直到所有的文本行都处理完毕。
二 sed基本语法
sed OPTIONS… [SCRIPT] [INPUTFILE…]
常用的选项
-n--quiet--silent不输出模式空间中的内容使用安静模式在一般sed的用法中所有来自 STDIN的数据一般都会被列出到屏幕上但如果加上-n参数后则只有经过sed特殊处理的那一行才会被 列出来
-i直接编辑原文件而不是由屏幕输出默认不对原文件进行操作
-e直接在命令行模式上进行sed的动作编辑多个子命令之间也可以用分号隔开 sed -e 'command1;command2... filename 或者 sed -e 'command1' -e 'command2' ……filename
-r使用扩展正则表达式
-f直接将sed的动作写在一个文件内-f filename则可以执行filename内的sed动作。
三模式空间中的编辑操作
1 地址定界
1, ##为数字指定要进行处理操作的行1表示第一行
1打开文本文件
[root@wangjingjing 0203]# vim sed_text.txt
2编写文本文件
Hello
World
SHELL
Xian
welcome
expression
environment
interesting
amazing
3打印sed_text.txt文件的第三行(模式空间的内容也打印出来)
[root@wangjingjing 0203]# sed '3p' sed_text.txt
Hello
World
SHELL
SHELL
Xian
4只打印sed_text.txt文件的第三行-n 经过命令处理的行,模式空间内容不打印
[root@wangjingjing 0203]# sed -n '3p' sed_text.txt
SHELL
2 $表示最后一行多个文件进行操作的时候为最后一个文件的最后一行
打印sed_text.txt文件的最后一行
[root@wangjingjing 0203]# sed -n '$p' sed_text.txt
Xian
3 /regexp/表示能够被regexp匹配到的行
打印sed_text.txt文件中以S开头的行
[root@wangjingjing 0203]# sed -n '/^S/p' sed_text.txt
SHELL
4 / 正则表达式 /I(大写字母i):匹配时忽略大小写
打印sed_text.txt文件中以s小写开头的行匹配到了SHELL
[root@wangjingjing 0203]# sed -n '/^s/Ip' sed_text.txt
SHELL
5 \%regexp%: 任何能够被regexp匹配到的行换用%用其他字符也可以如#为边界符号
打印sed_text.txt文件中以S开头的行,正则表达式里将"/"换为"%"
[root@wangjingjing 0203]# sed -n '\%^s%Ip' sed_text.txt
SHELL
6 addr1,addr2指定范围内的所有的行
打印sed_text.txt文件中的2-3行
[root@wangjingjing 0203]# sed -n '2,3p' sed_text.txt
World
SHELL
7 first~step指定起始的位置及步长
打印sed_text.txt文件中从首行开始步长为1的行
[root@wangjingjing 0203]# sed -n '1~2p' sed_text.txt
Hello
SHELL
welcome
environment
amazing
8addr1,+N指定行以及以后的N行
打印sed_text.txt文件中第一行以及第一行后面两行
[root@wangjingjing 0203]# sed -n '1,+2p' sed_text.txt
Hello
World
SHELL
9 addr1,~N从指定行开始然后结束到给定这个N倍数结束
1,~2p
2,~2p
指的是从指定行开始然后结束到给定这个N的倍数结束
[root@wangjingjing 0203]# sed -n '1,~2p' sed_text.txt
Hello
world
[root@wangjingjing 0203]# sed -n '2,~2p' sed_text.txt
world
SHELL
Xian
注意事项:
1、如果没有指定地址表示命令将应用于每一行
2、如果只有一个地址表示命令将应用于这个地址匹配的所有行
3、如果指定了由逗号分隔的两个地址表示命令应用于匹配第一个地址和第二地
址之间的行(包括这两行)
4、如果地址后面跟有感叹号表示命令将应用于不匹配该地址的所有行
1、如果没有指定地址表示命令将应用于每一行
[root@wangjingjing 0203]# sed -n p sed_text.txt
Hello
World
SHELL
Xian
welcome
expression
environment
interesting
amazing
2如果地址后面跟有感叹号表示命令将应用于不匹配该地址的所有行
打印sed_text.txt文件除了前3行所有的行
[root@wangjingjing 0203]# sed -n '1,3!p' sed_text.txt
Xian
welcome
expression
environment
interesting
2 常用编辑命令
1 d删除匹配到的行
在模式空间中删除匹配到的行文件里的行还在
[root@wangjingjing 0203]# sed '2d' sed_text.txt
Hello
SHELL
Xian
welcome
expression
environment
interesting
amazing
-i 对原文件进行修改
删除sed_text.txt文件中的第九行
[root@wangjingjing 0203]# sed -i '9d' sed_text.txt
[root@wangjingjing 0203]# cat sed_text.txt
Hello
World
SHELL
Xian
welcome
expression
environment
interesting
2 p打印当前模式空间内容
打印第二行
[root@wangjingjing 0203]# sed -n '2p' sed_text.txt
World
原文件没有修改
3, a \textappend,表示在匹配到的行之后追加内容
在sed_text.txt文件中第一行后面(第二行)追加China
[root@wangjingjing 0203]# sed '1a \China' sed_text.txt
Hello
China
World
SHELL
Xian
welcome
expression
environment
interesting
4, i \textinsert,表示在匹配到的行之前追加内容
在sed_text.txt文件中第一行前面(第0行)追加China
[root@wangjingjing 0203]# sed '1i \China' sed_text.txt
China
Hello
World
SHELL
Xian
welcome
expression
environment
interesting
5, c \textchange,表示把匹配到的行和给定的文本进行交换
在sed_text.txt文件中第一行Hello换成China
[root@wangjingjing 0203]# sed '1c \China' sed_text.txt
China
world
SHELL
Xian
welcome
expression
environment
interesting
6, s/regexp/replacement/flages查找替换,替换regexp匹配到的内容
把第一行的Hello 换成Hi
[root@wangjingjing 0203]# sed '1s@Hello@Hi@' sed_text.txt
Hi
World
SHELL
Xian
welcome
expression
environment
interesting
常用的flages
1g全局替换默认只替换第一个
把第一行中的hi全部替换为hello
[root@wangjingjing 0203]# sed '1s@hi@hello@g' sed_text.txt
hello hello hello hello
ya ya ya ya
World
SHELL
Xian
welcome
expression
environment
interesting
2i 不区分大小写
把第一行中的hi(i) 全部(g)替换为hello并打印出来(p)
[root@wangjingjing 0203]# sed -n '1s@HI@hello@gpi' sed_text.txt
hello hello hello hello
3p如果成功替换则打印
把第一行中所有的hi替换成hello打印出来只显示处理行
[root@wangjingjing 0203]# sed -n '1s@hi@hello@gp' sed_text.txt
hello hello hello hello
把第一行中所有的hi替换成hello打印出来模式内容与处理行一起打印
[root@wangjingjing 0203]# sed '1s@hi@hello@gp' sed_text.txt
hello hello hello hello
hello hello hello hello
ya ya ya ya
World
SHELL
Xian
welcome
expression
environment
interesting
7, r 读入文件内容追加到匹配行后面
1编辑文件append_content.txt
[root@wangjingjing 0203]# vim append_content.txt
2将append_content.txt文件追加到sed_text.txt第一行后面
[root@wangjingjing 0203]# sed '1r append_content.txt' sed_text.txt
hi hi hi hi
append
append1
ya ya ya ya
World
SHELL
Xian
welcome
expression
environment
interesting
8 R 读入文件一行内容追加到匹配行后面
将append_content.txt文件的第一行追加到sed_text.txt第一行后面
[root@wangjingjing 0203]# sed '1R append_content.txt' sed_text.txt
hi hi hi hi
append
ya ya ya ya
World
SHELL
Xian
welcome
expression
environment
interesting
9y y/source/dest/ 固定长度替换要求替换的字符串长度相等
把第一行中的hi 换为ha
[root@wangjingjing 0203]# sed '1y/hi/ha/' sed_text.txt
ha ha ha ha
ya ya ya ya
World
SHELL
Xian
welcome
expression
environment
interesting
10, w /path/to/somefile将匹配到的文件内容追加到指定的文件末尾
将sed_text.txt 文件中的前三行覆盖文件append_content.txt
[root@wangjingjing 0203]# sed '1,3w append_content.txt' sed_text.txt
hi hi hi hi
ya ya ya ya
World
SHELL
Xian
welcome
expression
environment
interesting
查看修改后的append_content.txt内容
[root@wangjingjing 0203]# cat append_content.txt
hi hi hi hi
ya ya ya ya
World
11 sed '1 s/north/hello/2' datafile --只替换第一行第二个
把第一行第二个原来的hi 换为Hello
[root@wangjingjing 0203]# sed '1s/hi/Hello/2' sed_text.txt
hi Hello hi hi
ya ya ya ya
World
SHELL
Xian
welcome
expression
environment
interesting
3巧用替换删除内容不是删除行
1 给每一行开头增加#
1 \(.*\)表示分组1的内容即匹配所有内容在分组1前面加上#
[root@wangjingjing 0203]# sed 's/^\(.*\)/#\1/' sed_text.txt
#hi hi hi hi
#ya ya ya ya
#World
#SHELL
#Xian
#welcome
#expression
#environment
#interesting
2 &表示前面要替换的所有内容分即在所有内容前加#
[root@wangjingjing 0203]# sed 's/^.*/#&/' sed_text.txt
#hi hi hi hi
#ya ya ya ya
#World
#SHELL
#Xian
#welcome
#expression
#environment
#interesting
2 sed 's/^.//' datafile --删除每行第一个字符
1 打开文本文件sed_text.txt
[root@wangjingjing 0203]# vim sed_text.txt
2 编辑文本内容
#hi hi hi hi
#ya ya ya ya
#World
#SHELL
#Xian
#welcome
#expression
#environment
#interesting
3.表示单个任意字符把每行开始任意一个字符换成空
[root@wangjingjing 0203]# sed 's/^.//' sed_text.txt
hi hi hi hi
ya ya ya ya
World
SHELL
Xian
welcome
expression
environment
interesting
3 sed 's/^\//' datafile --删除每行第一个单词
\< 单词词首 \>单词词尾
1打开文本文件sed_text.txt
[root@wangjingjing 0203]# vim sed_text.txt
2编辑文本内容
#hi hi hi hi
#ya ya ya ya
#World
#SHELL. shell
#Xian! xian
#welcome? welcome
#expression expression
#environment environment
#interesting interesting
3 删除每行的第一个单词
[root@wangjingjing 0203]# sed 's/^\<\w*\>//' sed_text.txt
hi hi hi
ya ya ya
. shell
! xian
? welcome
expression
environment
interesting
四sed扩展
1 对指定行以外的所有行应用命令
除了第一行打印全文
[root@wangjingjing 0203]# sed -n '1!p' sed_text.txt
ya ya ya ya
World
SHELL
Xian
welcome
expression
environment
interesting
2 = 打印当前行行号
[root@wangjingjing 0203]# sed -n '1!p;=' sed_text.txt
1
ya ya ya ya
2
World
3
SHELL
4
Xian
5
welcome
6
expression
7
environment
8
interesting
9
3 {} 对单个地址或地址范围执行批量操作
对第一行进行1操作和2操作{} 内是一个整体
[root@wangjingjing 0203]# sed -n '1{p;=}' sed_text.txt
hi hi hi hi
1