sed 和grep 统计/etc/init.d/functions文件中每个单词的出现次数,结果不同

来源:互联网 发布:现在还能做淘宝吗 编辑:程序博客网 时间:2024/05/16 00:27

题目:统计/etc/init.d/functions文件中每个单词的出现次数, 并排序(用grep和sed两种方法分别实现)

一、grep

1.有一个 -o 选项,可以把一行中的所有单词的都过滤出来

egrep -o "\<[[:alpha:]]+\>" /etc/init.d/functions |sort |uniq -c |sort -n

这里写图片描述
结果太多,只截后面一部分的
这里写图片描述

二、sed

sed -r 's@[^[:alpha:]]+@\n@g' /etc/init.d/functions |sort |uniq -c |sort -n

这里写图片描述
结果太多,只截后面一部分的
这里写图片描述

显示结果差了好多

这里写图片描述

分析

1.sed如果要对一行中的多个单词进行正向截取很难
因为,截取时使用
's@.*[^[:alpha:]](\<[[:alpha:]]+\>).*@\1@p'
一行只能替换出一个单词

2.所以只能进行反向替换,把不是单词的替换为换行符/n。

a.单词是有**分隔符隔开**的多个英文字母例如( 空格 -  引号  )等4.把**不是单词**的字符替换为空即 **不是单词**---->   **不是**\<[[:alpha:]]+\>   ;

5.可是使用sed正则只能表示
不是多个字母 —-> [^[:alpha:]]+

6.所以使用sed后果就是把不是多个字母替换为换行了,
剩下的是 单词非单词的多个字母

会出现类似以下的情况

echo "w(or4d)hi hello"| sed  -r 's@[^[:alpha:]]+@\n@g'

这里写图片描述
只有 hello是 单词,可是把不是单词的英文字母也截取出来了

三、如果哪位道友知道如何用sed过滤非单词,希望评论区留个言或者私信下,谢谢

这里写图片描述

阅读全文
0 0
原创粉丝点击