こんにちは皆さん、ちょっとした運動を手伝っていただけるかと思います。
while
ループを使用して.bashrc
ファイルを1行ずつ読み、数字のない行数を計算します。
基本的にこれはスクリプトですが、何も理解できないようです。助けやアドバイスをいただきありがとうございます。このような場合でも使用できるかどうかを知りたいです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
ファイルを1行ずつ読みます。行に数字が含まれている場合(「数字」を検出するのに十分であると仮定)、その数字は削除されます。残りの行が計算され、数字のない行の総数が表示されます。
およびオプションの説明を参照してくださいman grep
。ただし、デフォルトでは(行自体ではなく)一致する行数を返し、一致の意味を反転してその行のみを返します。-c
-v
-c
grep
-v
いいえ与えられたパターンと一致する結果を返します。
このパターンは、[[:digit:]]
数値を含むすべての行と一致します。
を使用すると、awk
行数を直接追跡する必要があります。
awk '!/[[:digit:]]/ { count++ } END { print count }' ~/.bashrc
ここで、!
現在行の数字の前にあるテストはテストの意味を反転します。行が正常にテストされると、この変数がインクリメントcount
されます。END
読み取る行がなくなると、このブロックが実行され、現在の値が出力されますcount
。
次のファイルが発生すると予想される場合は、このスクリプトを改善する必要があります。いいえ数字のない行count
(例:空(いいえ0
)。たとえば、ブロックを使用したり、BEGIN { count = 0 }
with文で算術評価を強制したりできます。print
print 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"
grep
awk
解決策は正規表現マッチングを使用しますが、ここに示されている2つのループは「ワイルドカードパターン」を使用して数字を一致させます。
個人的には、より簡単なソリューションを選択しますgrep
。同じ機能が組み込まれている場合は不要なwhile
ため、本番コードで上記のループを「修正」しないでください。grep
さらに、私は文章を書くときに2つのタイプミスとミスを修正しなければなりませんでしたgrep
。