如何计算字符串中某个字符出现的次数

如何计算字符串中某个字符出现的次数

主要问题:

编写一个脚本来确定相对于文件系统根的路径深度。该路径作为命令行上的参数接收。如果未收到参数,则将当前工作目录视为路径。如果参数不是有效路径,则会将错误消息打印到 stderr 并返回非零退出状态。其他错误情况(例如没有足够的权限读取给定路径)应以类似的方式处理。如果成功,脚本应将深度打印到标准输出并返回 0。

我知道如何处理错误情况,但我的主要问题是找到路径的深度。我正在考虑将给定路径保存为字符串并计算“/”幽灵的数量。我发现我可以使用以下命令来做到这一点:

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

但即使我更改多个目录,它也会显示 1。我还在学习 shell 脚本,所以你能给我详细的解决方案吗?

答案1

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.

答案2

您的帖子 ( ) 中的命令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

答案3

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

您需要将工作目录重定向回 grep,然后打印行数。

答案4

要计算路径中“/”的数量只需使用以下命令。经测试,效果很好

命令

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

输出

@praveen t1]#

 pwd
/tmp/p1/t1

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

3

[根@praveen

相关内容