数値を含まない行数を計算するスクリプト

数値を含まない行数を計算するスクリプト

こんにちは皆さん、ちょっとした運動を手伝っていただけるかと思います。

  1. whileループを使用して.bashrcファイルを1行ずつ読み、数字のない行数を計算します。

基本的にこれはスクリプトですが、何も理解できないようです。助けやアドバイスをいただきありがとうございます。このような場合でも使用できるかどうかを知りたいですgrepawk

私の試み:

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ファイルを1行ずつ読みます。行に数字が含まれている場合(「数字」を検出するのに十分であると仮定)、その数字は削除されます。残りの行が計算され、数字のない行の総数が表示されます。

およびオプションの説明を参照してくださいman grep。ただし、デフォルトでは(行自体ではなく)一致する行数を返し、一致の意味を反転してその行のみを返します。-c-v-cgrep-vいいえ与えられたパターンと一致する結果を返します。

このパターンは、[[:digit:]]数値を含むすべての行と一致します。


を使用すると、awk行数を直接追跡する必要があります。

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

ここで、!現在行の数字の前にあるテストはテストの意味を反転します。行が正常にテストされると、この変数がインクリメントcountされます。END読み取る行がなくなると、このブロックが実行され、現在の値が出力されますcount

次のファイルが発生すると予想される場合は、このスクリプトを改善する必要があります。いいえ数字のない行count(例:(いいえ0)。たとえば、ブロックを使用したり、BEGIN { count = 0 }with文で算術評価を強制したりできます。printprint 0+count


「読んで理解したとします。シェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?「そして」「IFS=read-r-line」を理解する「教師の要件を満たすために、/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解決策は正規表現マッチングを使用しますが、ここに示されている2つのループは「ワイルドカードパターン」を使用して数字を一致させます。

個人的には、より簡単なソリューションを選択しますgrep。同じ機能が組み込まれている場合は不要なwhileため、本番コードで上記のループを「修正」しないでください。grepさらに、私は文章を書くときに2つのタイプミスとミスを修正しなければなりませんでしたgrep

おすすめ記事