如何在变量中的 /summary/ 之后 grep 一个单词并将该单词存储在 bash 脚本中的新变量中

如何在变量中的 /summary/ 之后 grep 一个单词并将该单词存储在 bash 脚本中的新变量中

我提示用户输入路径并将其存储在名为路径的变量中。

$path: /a/b/c_12/d/e/summary/system/mode/output/file.txt

路径的结构总是相同的,只是系统、模式、输出名称不固定。因此,我计划 grep 位于 /summary/ 之后的系统名称。

我如何 grep 系统名称然后存储在变量中,以便我可以使用 bash 脚本使用该变量?我期望系统名称应该位于新变量中。 (例如$系统名称)

答案1

如果“系统”路径结构相同,则可以用于cut此任务。
-d 代表分隔符,在您的情况下它是“/”。而-f则需要选择被切割的部分。

cs-server@:~/$ systemname=$(echo "/a/b/c_12/d/e/summary/system/mode/output/file.txt" | cut -d'/' -f8)
cs-server@:~/$ echo $systemname
system
cs-server@:~/$

答案2

使用bash外壳参数扩展

$ path='/a/b/c_12/d/e/summary/system/mode/output/file.txt'
$ b=${path##/a/b/c_12/d/e/summary/}
$ echo $b
system/mode/output/file.txt
$ echo ${b%%/*}
system
$ 

也可以看看:

如何在 bash 中进行字符串操作?

如何使用参数扩展?如何获取子字符串?如何获取不带扩展名的文件,或仅获取文件的扩展名?执行基本名称和目录名称有哪些好方法?

答案3

使用 Bash ERE 支持:

$ echo $FILE
/a/b/c_12/d/e/summary/system/mode/output/file.txt
$ [[ $FILE =~ (\/[a-zA-Z_0-9]*){7} ]]
$ echo ${BASH_REMATCH[1]:1}
system

鉴于OP将要求更改为:系统名称可以是任何地方,但总是在之后summary

$ echo $FILE
/a/b/c_12/d/e/f/g/summary/system/mode/output/file.txt
$ [[ $FILE =~ (*\/summary\/[a-zA-Z_0-9]*){1} ]]
$ echo ${BASH_REMATCH[2]:9}
system

答案4

AWK:

var1=$(echo '/a/b/c_12/d/e/summary/system/mode/output/file.txt' | awk 'BEGIN{FS="/";}{print $8}');echo $var1

相关内容