用不同的分隔符计算单词中的字符

Counting char in word with different delimiter

我正在编写一个 shell 脚本,在其中我通过 java 获取 java 的位置。作为回应,我得到(例如)

/usr/pi/java7_32/jre/bin/java.

我需要剪切路径以 /jre/ 结尾,更具体地说

/usr/pi/java7_32/jre/

因为提供此信息的程序无法处理较长的工作路径。

我使用 cut 和 / 作为分隔符,因为我认为 Java 安装目录总是相同的,因此

cut -d'/' -f1-5

得到这个结果的效果很好:

/usr/pi/java7_32/jre/

但由于 java 也可以安装在其他地方,例如

/usr/java8_64/jre/

该语句无法正常工作。

我需要尝试过 sed、awk、cut 和它们的不同组合,但没有找到我喜欢的答案。

正如标题所说,在shell从左到右数的前提下,我会统计汽车出现的次数/直到找到替代jre/正确的。

递增的数字将是我想用分隔符剪切的字段。

path=$(which java) # example: /usr/pi/java7_32/jre/bin/java
i=0

#while loop with a statment which would go through path

while substring != jre/ {

  if (char = '/') 
    i++
}

#cut the path 
path=$path | cut -d'/' -f 1-i  

#/usr/pi/java7_32/jre result 

问题是前后路径的最终差异

/java7_64/jre/, like   */java*/jre/

我愿意接受任何想法和解决方案,非常感谢!

问候 一月

你可以用grep得到结果:

path=$(echo $path | grep -o ".*/jre/")

您可以使用shell的内置参数操作来获得您所需要的。 (这将节省创建其他进程来提取所需信息的需要)。

jpath="$(which java)"
# jpath now /usr/pi/java7_32/jre/bin/java

echo ${jpath%jre*}jre

产生

/usr/pi/java7_32/jre

同样适用于

jpath=/usr/java8_64/jre/

% 表示从字符串右侧删除匹配的 shell reg-ex 模式。然后我们放回 jre 以获得您需要的路径。

您可以覆盖 which java

中的值
jpath=${jpath%jre*}jre

IHTH