目录结构的字符串操作

string manipulation of Directory structure

场景:我有一个脚本但不知道我在目录树中的什么位置,我需要解析回最近的已知位置 UPROC[something]

到目前为止我有: 我在目录中有一个脚本 运行 例如:

/home/jim/query/UPROCL/test/bob/dircut.sh

现在唯一不变的是我想要的目录将以 UPROC 开头...也许不是 UPROCL 但肯定是 UPROC

所以我写了以下内容:

#!/bin/bash

#Absolute path for this script
SCRIPT=$(readlink -f "[=11=]")
echo $SCRIPT

#Gets Path of script without script name
SCRIPTPATH=$(dirname "$SCRIPT")
echo $SCRIPTPATH

#Cuts everything after UPROC(.* is wildcard)/
CUTDOWN=$(sed 's/\(UPROC.*\/\).*//' <<< $SCRIPTPATH)
echo $CUTDOWN

唯一的问题是它的输出是:

/home/jim/query/UPROCL/test/bob/dircut.sh
/home/jim/query/UPROCL/test/bob
/home/jim/query/UPROCL/test/

谁能告诉我我的 sed 命令有什么问题,因为它没有减少到

/home/jim/query/UPROCL/

因为()中的.*匹配到test/末尾的/

您需要 [^/]* 而不是 . 才能不匹配任何斜杠。

因为*是贪心的。您希望对 "UPROC" 之后允许的字符有更多的选择——任何非斜线

没有

sed 's/\(UPROC.*\/\).*//'

但是

sed -r 's,(UPROC[^/]*/).*,,'

s/// 命令使用不同的分隔符可以减少 "leaning toothpick" 问题。

当你想知道自己在哪个目录时,为什么不用pwd呢?

可能有用的一件事:命令 pwd 显示环境变量 PWD 的值(大写)。如果你想使用当前目录作为一个值,你可以使用这个。