计算不包含数字的行的脚本

计算不包含数字的行的脚本

大家好,我想知道你是否可以帮我做一个小练习。

  1. 使用while循环逐行读取.bashrc文件并计算没有遇到任何数字的行数。

基本上,这是一个脚本,但我似乎想不出任何东西。任何帮助或建议表示赞赏。我想知道在这种情况下grep使用是否可行。awk

我的尝试:

cat .bashrc | while read line; 
do if [ check_if_there_is_no_number_in $line ]; 
then increase_your_index>
fi done

有人可以帮忙完成剧本吗?提前致谢。

答案1

是的,使用它grep来完成此任务是可行的:

grep -c -v '[[:digit:]]' ~/.bashrc

这将逐行读取您的~/.bashrc文件。如果任何行包含数字(假设这足以检测“数字”),它将被丢弃。其余行将被计数,并显示不包含任何数字的总行数。

请参阅和选项man grep的描述,但基本上,使返回匹配行的数量(而不是行本身)并反转匹配的含义,以便仅行-c-v-cgrep-v不是返回匹配给定模式的结果。

该模式[[:digit:]]将匹配任何包含数字的行。


使用awk,您必须自己跟踪行数:

awk '!/[[:digit:]]/ { count++ } END { print count }' ~/.bashrc

在这里,!当前行上数字的测试前面的 反转了测试的含义。如果某行测试成功,则该变量count会递增。END当没有更多行可读取时执行该块,并将输出 的当前值count

如果我们期望遇到存在以下情况的文件,则需要对该脚本进行改进:没有数字的行,count就像空的(不是0)。例如,这可以通过块来完成,或者通过在with 语句BEGIN { count = 0 }中强制进行算术评估来完成。printprint 0+count


假设您已阅读并理解“为什么使用 shell 循环处理文本被认为是不好的做法?“ 和 ”理解“IFS=读取-r行””,为了满足老师的要求,我们可以使用/bin/sh脚本:

#!/bin/sh

count=0
while IFS= read -r line; do
    case $line in
        *[[:digit:]]*)
            ;;
        *)
            count=$(( count + 1 ))
    esac
done < ~/.bashrc

printf 'There are %d lines with no digit\n' "$count"

或者,与bash,

#!/bin/bash

count=0
while IFS= read -r line; do
    [[ $line != *[[:digit:]]* ]] && count=$(( count + 1 ))
done < ~/.bashrc

printf 'There are %d lines with no digit\n' "$count"

虽然grepawk解决方案使用正则表达式匹配,但此处显示的两个循环都使用“通配模式”来匹配数字。

就我个人而言,我会选择更简单的grep解决方案。我永远不会while在生产代码中“确定”上述循环,因为当grep内置相同的功能时,这是不必要的。此外,我在编写它们时必须纠正两个拼写错误和遗漏,这意味着一个马虎的程序员可能会犯错更多的错误,简单的解决方案可能不会出现这种情况grep

相关内容