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

本文探讨了如何使用grep和sed统计/etc/init.d/functions文件中每个单词的出现次数。通过举例说明,发现grep的-o选项可以过滤出单词,而sed在处理时遇到困难,因为其正则表达式难以实现单词的精确筛选,导致结果包含非单词的多个字母。作者寻求使用sed过滤非单词的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:统计/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过滤非单词,希望评论区留个言或者私信下,谢谢

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值