大家好,我想知道你是否可以帮我做一个小练习。
- 使用
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
-c
grep
-v
不是返回匹配给定模式的结果。
该模式[[:digit:]]
将匹配任何包含数字的行。
使用awk
,您必须自己跟踪行数:
awk '!/[[:digit:]]/ { count++ } END { print count }' ~/.bashrc
在这里,!
当前行上数字的测试前面的 反转了测试的含义。如果某行测试成功,则该变量count
会递增。END
当没有更多行可读取时执行该块,并将输出 的当前值count
。
如果我们期望遇到存在以下情况的文件,则需要对该脚本进行改进:不没有数字的行,count
就像空的(不是0
)。例如,这可以通过块来完成,或者通过在with 语句BEGIN { count = 0 }
中强制进行算术评估来完成。print
print 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"
虽然grep
和awk
解决方案使用正则表达式匹配,但此处显示的两个循环都使用“通配模式”来匹配数字。
就我个人而言,我会选择更简单的grep
解决方案。我永远不会while
在生产代码中“确定”上述循环,因为当grep
内置相同的功能时,这是不必要的。此外,我在编写它们时必须纠正两个拼写错误和遗漏,这意味着一个马虎的程序员可能会犯错更多的错误,简单的解决方案可能不会出现这种情况grep
。