欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > linux >内容正文

linux

Linux之sed:修改器按照字符和行数进行筛选和替换行值 选项[动作

发布时间:2024/9/19 linux 49 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Linux之sed:修改器按照字符和行数进行筛选和替换行值 选项[动作 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

 说明

sed用于选取替换删除新增   sed [选项] [动作][文件]选项: -n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。 -e:允许对输入数据应用多条sed命令编辑。 -f 脚本文件名:从sed脚本中读入sed操作。和awk命令的-f非常类似。 -r:在sed中支持扩展正则表达式。 -i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出动作: a \:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。 c \:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未结。 i \:插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。 d:删除,删除指定的行。 p:打印,输出指定的行。 s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/ 旧字串/新字串/g”(和vim中的替换格式 类似)。sed所做的修改并不会直接改变文件的内容(如果是用管道符接收的命令的输出,这种情况连文件都没有), 而是把修改结果只显示到屏幕上,除非使用“-i”选项才会直接修改文件。

查询

-n只输出合乎条件的 p显示第二行 sed -n '2p' test.txt 输出:22 bbi修改 d删除第二行 sed -i '2d' test.txt

删除

删除第2行 m,n 表示对m和n行之间的所有行进行操作,也包含第m行和第n行 m,$ 表示对m行以及其后面的所有行进行操作 2d表示仅仅删除第2行 [root@localhost string]# sed '2d' t1.txt > t4.txt [root@localhost string]# cat t4.txt t1t1t1t1t1t1t1t1t1t1t1t1t1删除以2开头的行 sed '/^2/d' test.txt删除包含2的文件 sed '/2/d' test.txt

新增:a后i前c替换行s替换字符串

sed '1a hello world' test.txt 其中a命令表示在指定行的后面附加一行,1a则是在第一行的后面添加一行,添加的内容就是a后面的内容,如 果a的前面没有地址限定则在所有行的后面都会添加指定的字符串sed '1i hello world' test.txt 命令i表示在指定的行的前面插入一行,插入的内容为其后面的字符串sed '1c hello world' test.txt 命令c会替换指定的行的所有内容,替换成其后面的字符串,所有的新增,删除,替换行,这些命令前面的地址 修饰都可以指定地址空间,也都可以使用正则表达式,命令会应用在选出的符合地址条件的所有行上面,如: sed '/^2/c hello world' test.txt 替换以2开头的行,其内容是c命令后面的字符串替换部分字符串而不是整行 sed 's/aa/AA/' test.txt s/待替换的字符串/新字符串/ 也就是说使用后面的 AA 替换文件中出现的前面的 aa sed '1s/aa/AA/g' test.txt 加上g选项之后,全局替换,也就说一行中所有符合条件的旧字符串都会被替换成新字符串,而不仅仅是第一个 可以看到仅仅对第一行进行了替换操作,其他的地址限定方法同样也是可以使用的,我们可以使用m,n的限定, sed '5,$s/aa/AA/g' test.txt sed '/^[0-9]/s/aa/AA/g' test.txt 我们在s命令前面添加了 /^[0-9]/ 这个修饰,该正则表达式表示对所有以数字开头的行,执行s操作

元字符

$ 表示行尾 ^ 表示行首 [a-z0-9]表示字符范围 [^]表示除了字符集中的字符以外的字符sed的正则中 \(\) 和 \{m,n\} 需要转义 . 表示任意字符 * 表示零个或者多个 \+ 一次或多次   \? 零次或一次 \| 表示或语法

例子

sed -n '/^2011-08-23.*ERROR/p' demolog.log2011-08-23 19:57:30,709 [] ERROR bo.CommodityCerOrderBO - order-fi 2011-08-23 19:57:31,721 [] ERROR bo.CommodityCerOrderBO - order-f提取demo.log中的日期,日志级别,订单id和状态。 sed -f demo.sed2 demo.log #下面的一行是替换指令,就是把19位长的日期和INFO/ERROR,id,和后面的一截提取出来,然后用@分割符把这 4个字段重新按顺序组合 s/^\([-\: 0-9]\{19\}\).*\(INFO\|ERROR\) .*order-fix.curr_id:\([0-9]\+\),\(.*$\)/\1@\3@\2@\4/p 输出: 2011-08-23 19:57:30@10117@INFO@status:attr_ids不含0跳过 2011-08-23 19:57:30@10117@ERROR@status:添加属性id,但由于认证分类参数有误默认取匹配属性名称的第 一个属性id:100104 2011-08-23 19:57:31@10117@ERROR@status:添加属性id,但由于认证分类参数有误默认取匹配属性名称的第 一个属性id:100105

 

总结

以上是生活随笔为你收集整理的Linux之sed:修改器按照字符和行数进行筛选和替换行值 选项[动作的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。