文字列内の特定の文字の発生回数を計算する方法

文字列内の特定の文字の発生回数を計算する方法

主な問題:

ファイルシステムのルートに基づいてパスの深さを決定するスクリプトを作成します。パスはコマンドラインから引数として受け取ります。引数を受け取らない場合、現在の作業ディレクトリはパスとして扱われます。引数が有効なパスでない場合、エラーメッセージが stderr に出力され、ゼロ以外の終了ステータスが返されます。他のエラー状態(たとえば、指定されたパスを読み取るための権限が不足している)も同様の方法で処理する必要があります。成功すると、スクリプトは標準出力に深さを印刷してゼロを返す必要があります。

エラーケースを処理する方法を知っていますが、主な問題はパスの深さを見つけることです。与えられたパスを文字列として保存し、 "/"ゴーストの数を数えるかどうかを考えています。次のコマンドを使用してこれを実行できることがわかりました。

grep -o "/" $PWD | wc -l

ただし、複数のディレクトリを変更しても1が表示されます。私はまだシェルスクリプトを学んでいます。詳細な解決策を教えてもらえますか?

答え1

grep -o "/" $PWDPWD読み取るファイルの名前として使用されます。多くのシステムでは、ファイルだけでなくディレクトリも読み取れないため、エラーが発生しているようです。 (一部のシステムを除くことはまだ可能ですが、ここでは内容はあまり役に立ちません。)

代わりにprintf "%s\n" "$PWD" | grep -o / | wc -l、ksh/Bash/zsh/yash に組み込まれた代替演算子を使用して、スラッシュを除くすべての項目を削除し、文字数を数えることができます。s=$PWD; s=${s//[^\/]}; num=${#s}

zsh短縮できますnum=${#PWD//[^\/]}

または標準的なツールを使用して下さい: printf %s "$PWD" | LC_ALL=C tr -dc / | wc -c

答え2

投稿()のコマンドは、パスを構成する文字列ではなくgrep -o "/" $PWD | wc -lgrepをターゲットとして使用しようとします。$PWD

希望の効果を得るには、次の手順を実行しますecho $PWD | grep -o "/" | wc -l

あるいは、目標はパスの深さを見つけることであるため、スラッシュの数ではなくパス内のディレクトリの数を計算できます。

たとえば、

echo "$PWD" | tr " /" "- " | wc -w

trすべてのスペースを「-」文字に変換し、すべての「/」をスペースに変換します。wc -w次に、前の出力の単語数を数えます。これにより、名前にスペースが含まれていても、各ディレクトリは1つの単語としてのみ計算されます。また、「/」の数はカウントされないため、ルートディレクトリの深さを確認すると、深さは0として表示されます。

  • 例1: $ pwd /tmp/test directory $ echo "$PWD" | tr " /" "- " | wc -w 2

  • 例2: $ pwd / $ echo "$PWD" | tr " /" "- " | wc -w 0

答え3

grep -o "/" <<< "$PWD" | wc -l

作業ディレクトリを再びgrepにリダイレクトし、行数を印刷する必要があります。

答え4

パスの「/」数を計算するには、次のコマンドを使用します。テスト後の効果はとても良いです

注文する

echo "$PWD" | awk '{print  gsub("/","",$0)}'

出力

@praveen t1]#

 pwd
/tmp/p1/t1

[ルート@praveen t1]#echo "$PWD" | awk '{print gsub("/","",$0)}'

3

[ルート@praveen

関連情報