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

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

主な問題:

ファイルシステムのルートに基づいてパスの深さを決定するスクリプトを作成します。パスはコマンドラインから引数として受け取ります。引数を受け取らない場合、現在の作業ディレクトリはパスとして扱われます。引数が有効なパスでない場合、エラーメッセージが 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

おすすめ記事