sed命令

Posted basa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed命令相关的知识,希望对你有一定的参考价值。

sed命令

1 sed

sed:流编辑器工具(文件字符流进行处理编辑)

1.1 sed作用

擅长对文件的行进行处理,修改编辑文件的内容。

1.2 语法

sed [参数]    '条件 指令(如何处理)' 文件信息
sed  -n     '/oldboy/p'          oldboy.txt

1.3 原理

按行处理文件信息

1.4 功能

增加、删除、修改、查询 擅长处理文本文件,配置文件 grep/awk擅长日志文件
以下命令环境条件:cat >person.txt<<EOF
? ??? ??? ??? ??? ??? ??? ??101,oldboy,CEO
? ??? ??? ??? ??? ??? ??? ??102,zhaoyao,CTO
? ??? ??? ??? ??? ??? ??? ??103,Alex,COO
? ? ? ? ? ? ? ? ? ? ? ? ? ? 104,yy,CFO
? ??? ??? ??? ??? ??? ??? ??105,feixue,CIO
? ??? ??? ??? ??? ??? ??? ??3p
? ??? ??? ??? ??? ??? ??? ??EOF

1.4.1 查询功能

查询单行信息:
(1)将第3行信息进行显示:sed -n ‘3p‘ person.txt
技术图片
(2)将有oldboy的行进行显示:sed -n ‘/oldboy/p‘ person.txt
技术图片
查询多行信息:
(1)将第3行~第5行信息进行显示:sed -n ‘3,5p‘ person.txt
技术图片
(2)将oldboy ~ alex信息进行显示:sed -n ‘/oldboy/,/Alex/p‘ person.txt
技术图片
(3)只查看第3行和第5行内容:sed -n ‘3p;5p‘ person.txt
技术图片
(4)只查看有oldboy和alex信息:sed -n ‘/oldboy/p;/Alex/p‘ person.txt
技术图片

1.4.2 删除功能

(1)将第三行信息进行删除:sed -i ‘3d‘ person.txt
技术图片
sed ‘3d‘ person.txt
技术图片
加 -i 与不加 -i 的区别:
加-i:表示是真的对硬盘中文件进行了编辑,所以会真正的删除。
不加-i:表示是对内存中的信息进行了编辑,所以不会真正的删除硬盘中的信息。
(2)将有oldboy信息的行进行删除:sed -i ‘/oldboy/d‘ person.txt
技术图片
sed ‘/oldboy/d‘ person.txt
技术图片
(3)将oldboy和Alex信息的行进行删除 :sed -ri.bak ‘/oldboy|Alex/d‘ person.txt
技术图片
-i.bak 表示对源文件进行备份 -- i参数后面不能跟其他参数
sed ‘/oldboy/d;/Alex/d‘ person.txt
技术图片

1.4.3 增加功能

(1)在第3行后面增加新的一行 内容 oldboy62:sed ‘3a oldboy62‘ person.txt
技术图片
真实修改:sed -i ‘3a oldboy62‘ person.txt
技术图片
(2)在第5行前面增加新的一行 内容 oldboy62:sed ‘5i oldboy62‘ person.txt
技术图片
真实修改:sed -i ‘5i oldboy62‘ person.txt
技术图片
(3)在第3行前面加oldboy62,同时在第5行后面加oldboy62:
sed -e ‘3ioldboy62‘ -e ‘5aoldboy62‘ person.txt
技术图片
真实修改: sed -i -e ‘3ioldboy62‘ -e ‘5aoldboy62‘ person.txt
技术图片
(4)在文件最后一行后面,添加一行信息:sed -e ‘$aoldboy62‘ person.txt
技术图片
真实修改: sed -i -e ‘$aoldboy62‘ person.txt
技术图片
(5)在文件最后一行后面,添加多行信息: sed ‘$aoldboy62\noldboyedu62‘ person.txt
技术图片
$:以什么结尾 只能匹配文件内容,不能匹配名称。正则符号只能匹配文件内容,不能匹配文件名称 \n:换行符

1.4.4 替换修改文件内容功能

(1)将123456 信息 显示 为 <123456>
①:echo 123456|sed -r ‘s#(.)#<\1>#g‘
技术图片
②:echo 123456|sed ‘s#.
#<&>#g‘
技术图片
③:echo 123456|sed -r ‘s#([0-9]+)#<\1>#g‘
技术图片
(2)将123456 信息 显示 为 <123><456>
①:echo 123456|sed -r ‘s#([0-9]3)#<\1>#g‘
技术图片
②:echo 123456|sed -r ‘s#(.3)#<\1>#g‘
技术图片
(3)将123456 信息 显示 为 <1><2><3><4><5><6>
①: echo 123456|sed -r ‘s#([0-9])#<\1>#g‘
技术图片
②:echo 123456|sed -r ‘s#([0-9]1)#<\1>#g‘
技术图片
③: echo 123456|sed -r ‘s#(.)#<\1>#g‘
技术图片
修改文件内容:
(1)使用-i 参数问题
-i.bak:表示对源文件进行备份 -i参数后面不能跟其他参数
sed -ri.bak ‘s#(.*)#<\1>#g‘ oldboy.txt
技术图片
(2)在利用-i替换参数文件内容信息,-i参数和-n参数一定不能同时使用
替换错误使用方法:
sed -ni.bak ‘/Alex/s#COO#CEO#gp‘ person.txt
技术图片
在这里,-n -i一块使用,-i 确定了修改的内容,-n 取消了文件其它内容,只显示-i 执行后的内容。这样会导致文件内容的丢失。所以-n -i 不能同时使用。
正取使用方法:
sed -i ‘/Alex/s#COO#CEO#g‘ person.txt
技术图片

(2)批量修改文件扩展名称
方法一:
find /oldboy -maxdepth 1 -type f -name "oldboy.txt"|sed -r ‘s#(.)txt#mv \1txt \1jpg#g‘|bash
技术图片
方法二:
ls oldboy.txt|xargs -n1|sed -r ‘s#(.)txt#mv & \1jpg#g‘
技术图片
方法三:利用rename 专业修改
rename ".txt" ".jpg" oldboy*.txt
技术图片

(3)取出文件数值权限信息
方法一:①stat /etc/hosts|sed -nr ‘4s#^A.s: ((.)/-.$#\1#gp‘
技术图片
stat /etc/hosts|sed -nr ‘4取出hosts文件第四行:Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
②stat /etc/hosts|sed -n ‘4s#^A.
s: ((.)/-.$#\1#gp‘
技术图片
方法二:
ll /etc/hosts|sed -r ‘s#^-(.). 1.$#\1#g‘
技术图片
ll /etc/hosts|sed -r ‘s#^-(.). 1.$#\1#g‘|tr "rwx-" "4210"
技术图片

(4)特殊替换文件内容信息:
①sed -n ‘3s/#103/103/gp‘ person.txt
技术图片
②sed -n ‘3s##103#103#gp‘ person.txt
技术图片
(5)修改整行内容
sed ‘3coldboy62‘ person.txt
技术图片
(6)取消空行不要显示
方法一:sed ‘/^$/d‘ person.txt
技术图片
方法二:
sed -n ‘/^$/!p‘ person.txt
技术图片
(7)利用sed命令显示文件行号信息
sed ‘=‘ person.txt:显示行号
技术图片
sed ‘=‘ person.txt|xargs -n2
技术图片

1.5 总结

1.5.1 参数

-n 取消默认输出
-i 真实修改文件内容
-e 识别多个指令信息,可以让多个指令同时执行
-r 识别扩展正则符号信息

1.5.2 指令

p print 输出信息
d delete 删除文件信息
i insert 在指定条件行的上面添加信息
a append 在指定条件行的下面添加信息
s substitute 取代==替换
g global 将所有匹配的信息都做替换(没有 将一行中第一个匹配的信息做替换)
c change 修改替换指定的整行信息

1.5.3 sed命令执行流程

技术图片

以上是关于sed命令的主要内容,如果未能解决你的问题,请参考以下文章

sed命令详解

如何在Unix下使用sed命令

关于Linux里的sed命令。

Linux学习笔记2(sed命令)

linux之文本内容替换命令sed

sed命令