String

如何計算字元串中某個字元出現的次數

  • January 26, 2018

主要問題:

編寫一個腳本,確定路徑相對於文件系統根的深度。路徑在命令行上作為參數接收。如果沒有接收到參數,則目前工作目錄被認為是路徑。如果參數不是有效路徑,則將錯誤消息列印到 stderr 並返回非零退出狀態。其他錯誤情況,例如讀取給定路徑的權限不足,應以類似方式處理。如果成功,腳本應該將深度列印到標準輸出並返回 0。

我知道如何處理錯誤情況,但我的主要問題是找到路徑的深度。我正在考慮將給定的路徑保存為字元串併計算“/”幻影的數量。我看到我可以使用這個命令來做到這一點:

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

但是即使我更改了多個目錄,它也會顯示 1。我還在學習 shell 腳本,你能給我詳細介紹一下解決方案嗎?

您的文章 ( grep -o "/" $PWD | wc -l) 中的命令將嘗試使用 grep$PWD作為目標,而不是組成該路徑的字元串。

為了達到您的預期效果,您可以這樣做echo $PWD | grep -o "/" | wc -l

作為替代方案,由於目標是找到路徑的深度,因此您可以計算該路徑中的目錄數量,而不是正斜杠的數量。

例如:

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

tr將所有空格轉換為“-”字元,將所有“/”轉換為空格。wc -w然後計算前一個輸出中的單詞數。這樣可以確保每個目錄僅計為一個單詞,即使它們的名稱中包含空格。此外,由於我們沒有計算“/”的數量,因此在根目錄檢查您的深度將指示深度為 0。

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

grep -o "/" $PWD會將 的內容PWD作為要讀取的文件的名稱。看起來它應該給您一個錯誤,因為在許多系統上,您無法像讀取文件一樣讀取目錄。(除了可能在某些系統中您仍然可以,但這裡的內容不會很有用。)

而是使用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.

引用自:https://unix.stackexchange.com/questions/419837