题目:统计/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是 单词,可是把不是单词的英文字母也截取出来了