sed命令
1 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 修改替换指定的整行信息