场景:我有一个脚本,但不知道我在目录树中的位置,我需要解析回最近的已知位置UPROC [something]
到目前为止我所拥有的: 我有一个在目录中运行的脚本,例如:
/home/jim/query/UPROCL/test/bob/dircut.sh
现在唯一不变的是,我想要的目录将以UPROC
开头......可能不是UPROCL
但绝对是UPROC
所以我写了以下内容:
#!/bin/bash
#Absolute path for this script
SCRIPT=$(readlink -f "$0")
echo $SCRIPT
#Gets Path of script without script name
SCRIPTPATH=$(dirname "$SCRIPT")
echo $SCRIPTPATH
#Cuts everything after UPROC(.* is wildcard)/
CUTDOWN=$(sed 's/\(UPROC.*\/\).*/\1/' <<< $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/
答案 0 :(得分:2)
因为*
贪婪。您希望在“UPROC”之后更加选择性地允许使用哪些字符 - 任何非斜杠
不
sed 's/\(UPROC.*\/\).*/\1/'
但是
sed -r 's,(UPROC[^/]*/).*,\1,'
为s///
命令使用不同的分隔符可以减少“倾斜牙签”问题。
答案 1 :(得分:1)
因为.*
中的()
与/
末尾的test/
匹配。
您需要[^/]*
代替.
才能匹配任何斜杠。
答案 2 :(得分:1)
如果您想知道自己在哪个目录中,为什么不使用pwd
?
可能有用的一件事:命令pwd
显示环境变量PWD
(大写)的值。如果您想将当前目录用作值,可以使用它。