微信公众号 手机网站,wordpress开启评论,百度排行,网络营销公司成功案例文本三剑客#xff1a;都是按行读取后处理。
grep 过滤行内容。awk 过滤字段。sed 过滤行内容#xff1b;修改行内容。sed编辑器
sed是一种流编辑器#xff0c;流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中…文本三剑客都是按行读取后处理。
grep 过滤行内容。awk 过滤字段。sed 过滤行内容修改行内容。sed编辑器
sed是一种流编辑器流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
sed编辑器可以根据命令来处理数据流中的数据这些命令要么从命令行中输入要么存储在一个命令文本文件中。
sed主要用来自动编辑一个或多个文件简化对文件的反复操作编写转换程序等
sed的工作流程
sed的工作流程主要包括读取、执行和显示三个过程
读取 sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中又称模式空间pattern space )。执行 默认情况下所有的sed命令都在模式空间中顺序地执行除非指定了行的地址否则sed命令将会在所有的行上依次执行。显示 发送修改后的内容到输出流。在发送数据后模式空间将会被清空。在所有的文件内容都被处理完成之前上述过程将重复执行 直至所有内容被处理完。
在所有的文件内容都被处理完成之前上述过程将重复执行直至所有内容被处理完。
注意默认情况下所有的sed命令都是在模式空间内执行的因此输入的文件并不会发生任何变化除非使用sed -i修改源文件、或使用重定向输出到新的文件中。 sed命令格式 sed -e 操作 文件1 文件2sed -n -e 操作 文件1 文件2sed -f 脚本文件 文件1 文件2sed -i -e 操作 文件1 文件2
执行多条命令的三种方法 sed -n -e 操作1 -e 操作2 文件sed -n -e 操作1;操作2 文件sed -e n{操作1操作2......} 文件1
常用选项
选项作用-e 或--expression表示用指定命令来处理输入的文本文件只有一个操作命令时可省略一般在执行多个操作命令使用-f 或--file表示用指定的脚本文件来处理输入的文本文件-h 或--help显示帮助-n、--quiet或--silent禁止sed编辑器输出但可以与p命令一起使用完成输出-i直接修改目标文本文件
常用操作
操作作用s替换替换指定字符d删除删除选定的行a增加在当前行下方增加一行指定内容i插入在选定行上方插入一行指定内容c替换将选定行替换为指定内容y字符转换转换前后的字符长度必须相同p打印行内容。如果同时指定行表示打印指定行如果不指定行则表示打印所有内容如果有非打印字符则以ASCII码输出。其通常与-n选项一起使用打印行号l (小写L)打印数据流中的文本和不可打印的ASCII字符比如结束符$、制表符\tsed的核心功能增删改查可配合正则表达式 查 p删 d改 s字符串替换、c整行替换、y对应字符进行替换效果类似tr命令增 i在行前插入内容、a在行后添加内容、r在行后读入文件的内容复制粘贴H复制、d删除、G粘贴到指定行下方 sed 查找打印p
4.1 不指定行顺序处理每一行
1、sed编辑器默认输出行内容-n选项可以禁止输出。如果不加-n却使用p操作那么每行内容会打印两次。
sed -e p 每行内容打印两次。
sed -n p 每行内容只打印一次。 [rootyuji ~]# cat ff.txt //查看文件内容共10行onetwothreefourfivesixseveneightnineten[rootyuji ~]# sed -e p ff.txt //每行内容会打印两次oneonetwotwothreethreefourfourfivefivesixsixsevenseveneighteightnineninetenten[rootyuji ~]# sed -n -e p ff.txt //每行内容只打印一次onetwothreefourfivesixseveneightnineten
2、n 打印行号。
sed -n 只打印行号。
sed -e n : 打印行号和行内容。
sed -n ;p 打印行号和行内容。 [rootyuji ~]# sed -e ff.txt //打印行号和行内容1one2two3three4four5five6six7seven8eight9nine10tensed 执行多条命令的三种方法。
以打印行号和行内容为例
#方法一sed -n -e -e p file.txt#方法二sed -n -e ;p file.txt#方法三换行操作sed -n p file.txt
l 打印文本即隐藏字符结束符$制表符\t。 [rootyuji ~]# sed -n l ff.txtone$two$three$four$five$six$seven$eight$nine$ten$ sed 对指定行进行操作
两种方法
以数字形式表示行区间用文本模式字符串来过滤出行一般结合正则表达式。以数字形式表示行区间
操作含义1p打印第一行$p打印最后一行1,3p打印连续行打印第一行到第三行6,$p打印第六行到最后一行1,3p打印第一行加后面三行即打印第一到第四行5q打印前五行后退出p;n打印奇数行n;p打印偶数行
使用字符串匹配出行
操作含义/root/p打印包含root的行/root/!p打印不包含root的行。! 表示取反/^root/p打印以root开头的行/bash$/打印以bash结尾的行/root l bash/p打印包含root或bash的行。l是扩展正则表达式的元字符要使用sed -r6,/root/p打印第6行到第一个包含root的行
使用正则表达式匹配行内容 先将/etc/passwd 文件复制到家目录下并改名为pass.txt方便演示
[rootyuji ~]# cp /etc/passwd pass.txt //复制文件并改名
[rootyuji ~]# sed -n /root/p pass.txt //打印包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[rootyuji ~]# sed -n /^root/p pass.txt //打印以root开头的行
root:x:0:0:root:/root:/bin/bash
[rootyuji ~]# sed -n /bash$/p pass.txt //打印以bash结尾的行
root:x:0:0:root:/root:/bin/bash
yuji2:x:1000:1000:yuji2:/home/yuji2:/bin/bash
nancy:x:1021:1021::/home/nancy:/bin/bash
helen:x:1022:1022::/home/helen:/bin/bash
[rootyuji ~]# sed -n 6,/root/p pass.txt //从第6行开始打印一直到第一个包含root的行sync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinoperator:x:11:0:operator:/root:/sbin/nologin[rootyuji ~]# sed -n 6,/root/ pass.txt //从从第6行开始打印行号一直到第一个包含root的行678910
sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时括号{}前不需要加反斜杠\ 。 [rootyuji ~]# sed -n /ro{2,}t/p pass.txtroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin[rootyuji ~]# sed -n -r /ro{2,}t/p pass.txtroot:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin#打印包含root或bash的行[rootyuji ~]# sed -n /root|bash/p pass.txt //如果不加-r则|前要加转义符\root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologinyuji2:x:1000:1000:yuji2:/home/yuji2:/bin/bashnancy:x:1021:1021::/home/nancy:/bin/bashhelen:x:1022:1022::/home/helen:/bin/bash[rootyuji ~]# sed -n -r /root|bash/p pass.txt //sed -r支持扩展正则表达式root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologinyuji2:x:1000:1000:yuji2:/home/yuji2:/bin/bashnancy:x:1021:1021::/home/nancy:/bin/bashhelen:x:1022:1022::/home/helen:/bin/bash通过字符串匹配出想要的行
[rootyuji ~]# sed /e$/d ff.txt //删除以e结尾的行twofoursixseveneightten[rootyuji ~]# sed /e$/!d ff.txt //除了以e结尾的行其他行都删除onethreefive
/字符串1/,/字符串2/d 从第一个匹配的位置打开删除功能到第二个匹配的位置删完后关闭删除功能。之后继续按这个规则向下查找删除。
[rootyuji ~]# cat 2.txt111222333444555111222333444555[rootyuji ~]# sed /2/,/4/d 2.txt 111555111555[rootyuji ~]# sed /1/,/3/d 2.txt444555444555
删除空行并保存sed -i /^$/d file.txt 使用-i前先备份目标文件 [rootyuji ~]# cat file.txt112233[rootyuji ~]# sed -i /^$/d file.txt[rootyuji ~]# cat file.txt112233
删除空行的三种方法
grep -v ^$ file.txt //过滤出非空行cat file.txt |tr -s \n //压缩换行符sed /^$/d file.txt //删除空行
sed 修改替换s c y
s替换字符串
c整行替换
y字符替换替换前后的字符串长度必须相同 行范围 s/旧字符串/新字符串/替换标记#4种替换标记数字表明新字符串将替换第几处匹配的地方g表面新字符串将会替换所有匹配的地方p打印与替换命令匹配的行与-n一起使用w 文件将替换的结果写入文件中
[rootyuji ~]# sed -n /root/p pass.txt //打印所有包含root的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[rootyuji ~]# sed -n s/root/aaa/p pass.txt //将匹配行的第1个root替换成aaa
aaa:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/aaa:/sbin/nologin
[rootyuji ~]# sed -n s/root/aaa/2p pass.txt //将匹配行的第2个root替换成aaa
root:x:0:0:aaa:/root:/bin/bash
[rootyuji ~]# sed -n s/root/aaa/3p pass.txt //将匹配行的第3个root替换成aaa
root:x:0:0:root:/aaa:/bin/bash
[rootyuji ~]# sed -n s/root/aaa/gp pass.txt //将匹配行的所有root替换成aaa
aaa:x:0:0:aaa:/aaa:/bin/bash
operator:x:11:0:operator:/aaa:/sbin/nologin[rootyuji ~]# sed -n s/root//gp pass.txt //删除匹配行当所有root:x:0:0::/:/bin/bashoperator:x:11:0:operator:/:/sbin/nologin[rootyuji ~]# echo 000010101 | sed s/^0*// //删除开头所有的010101 [rootyuji ~]# sed -n s/root//gp pass.txt //删除匹配行当所有root :x:0:0::/:/bin/bash operator:x:11:0:operator:/:/sbin/nologin [rootyuji ~]# echo 000010101 | sed s/^0*//
//删除开头所有的0 10101
[rootyuji ~]# sed -n /^root/p pass.txt //打印所有以root开头的行root:x:0:0:root:/root:/bin/bash[rootyuji ~]# sed -n /^root/ s/^/#/p pass.txt //过滤出以root开头的行在行首加上##root:x:0:0:root:/root:/bin/bash[rootyuji ~]# sed -n /root/p pass.txt //打印包含root的行root:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/root:/sbin/nologin[rootyuji ~]# sed -n /root/ s/$/#/p pass.txt //在包含root的行的行尾加上#root:x:0:0:root:/root:/bin/bash#operator:x:11:0:operator:/root:/sbin/nologin#
另一种替换方式
将包含root内容的行进行注释
用正则表达式匹配包含root的整行内容之后在整行内容前加#。代表前面使用正则表达式匹配到的整行内容。
[rootyuji ~]# sed -n /root/ s/^/#/p pass.txt //过滤出包含root的行在行首加上##root:x:0:0:root:/root:/bin/bash#operator:x:11:0:operator:/root:/sbin/nologin[rootyuji ~]# sed -n s/.*root.*/#/p pass.txt#root:x:0:0:root:/root:/bin/bash#operator:x:11:0:operator:/root:/sbin/nologin [rootyuji ~]# vim 1.sh[rootyuji ~]# cat 1.sh/root/ s/^/#/p3,5 s/$/#/p[rootyuji ~]# sed -n -f 1.sh pass.txt //指定1.sh文件来执行#root:x:0:0:root:/root:/bin/bashdaemon:x:2:2:daemon:/sbin:/sbin/nologin#adm:x:3:4:adm:/var/adm:/sbin/nologin#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin##operator:x:11:0:operator:/root:/sbin/nologin
指定分隔符
当字符串中包含/时需要在前面加上转义符\避免和分隔符/混淆。这样操作非常麻烦且容易眼花看错此时可以自己指定分隔符。
s后面的第一个字符就是分隔符3个分隔符要保持一致如果遇到跟分隔符相同的字符需要使用 \ 转义成普通字符。
#默认分隔符为/[rootyuji ~]# sed -n s//bin/bash//sbin/nologin/p pass.txtroot:x:0:0:root:/root:/sbin/nologinyuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologinnancy:x:1021:1021::/home/nancy:/sbin/nologinhelen:x:1022:1022::/home/helen:/sbin/nologin#指定#作为分割符[rootyuji ~]# sed -n s#/bin/bash#/sbin/nologin#p pass.txtroot:x:0:0:root:/root:/sbin/nologinyuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologinnancy:x:1021:1021::/home/nancy:/sbin/nologinhelen:x:1022:1022::/home/helen:/sbin/nologin#指定!作为分隔符[rootyuji ~]# sed -n s!/bin/bash!/sbin/nologin!p pass.txtroot:x:0:0:root:/root:/sbin/nologinyuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologinnancy:x:1021:1021::/home/nancy:/sbin/nologinhelen:x:1022:1022::/home/helen:/sbin/nologin#指定8作为分隔符[rootyuji ~]# sed -n s8/bin/bash8/sbin/nologin8p pass.txtroot:x:0:0:root:/root:/sbin/nologinyuji2:x:1000:1000:yuji2:/home/yuji2:/sbin/nologinnancy:x:1021:1021::/home/nancy:/sbin/nologinhelen:x:1022:1022::/home/helen:/sbin/nologin[rootyuji ~]# cat ff.txtonetwothreefourfivesixseveneightnineten[rootyuji ~]# sed /fo/c 22 ff.txt //将包含fo的行整体替换成22onetwothree22fivesixseveneightnine单字符替换 y
使用y是对单个字符进行替换每个字符需要一一对应不是整体替换。前后字符串长度需要一致不然会报错。
示例
遇到n替换成2遇到o替换成5。
[rootyuji ~]# sed y/no/25/ ff.txt //遇到n替换成2遇到o替换成5 52e tw5 three f5ur five six seve2 eight 2i2e te2 [rootyuji ~]# sed y/no/255/ ff.txt sed-e 表达式 #1字符 9“y”命令的字符串长度不同
sed 增加a i r
a在行后添加内容
i在行前插入内容
r在行后读入文件内容 [rootyuji ~]# sed 1,3a 22 ff.txt //在第1~3行每行下方添加一行内容one22two22three22fourfivesixseveneightnineten [rootyuji ~]# cat hh.txthello world[rootyuji ~]# sed 6r hh.txt ff.txt //在第6行下方读入hh.txt文件内容onetwothreefourfivesixhello worldseveneightnineten
复制粘贴
比较vi/vim编辑器和 sed编辑器 #vi//vim编辑器命令模式dd p 剪切 粘贴yy p 复制 粘贴末行模式:1,3 co 10 复制 粘贴将第1~3行复制粘贴到第10行下方:1,3 m 10 剪切 粘贴将第1~3行剪切到第10行下方#sed命令H复制、d删除、G粘贴到指定行下方
[rootyuji ~]# sed 1,3 {H;d};$G ff.txt //将第1~3行剪切粘贴到最后一行下方fourfivesixseveneightninetenonetwothree[rootyuji ~]# sed 1,3 {H;d};5G ff.txt //将第1~3行剪切粘贴到第5行后面fourfiveonetwothreesixseveneightnineten 文件内容中的字符串进行互换 #将2个字符串交换位置[rootyuji ~]# echo 111222333111222333[rootyuji ~]# echo 111222333|sed -r s/(111)(222)/\2\1/222111333#将3个字符串交换位置[rootyuji ~]# echo 111222333|sed -r s/(111)(222)(333)/\3\2\1/333222111#将第一个字符和最后一个字符进行互换[rootyuji ~]# echo 111222333|sed -r s/^(.)(.*)(.)$/\3\2\1/311222331