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 oldboyedu62' person.txt

$:以什么结尾 只能匹配文件内容,不能匹配名称。正则符号只能匹配文件内容,不能匹配文件名称 :换行符

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命令执行流程

原文地址:https://www.cnblogs.com/basa/p/11136225.html