目录结构的字符串操作

时间:2015-11-10 13:54:41

标签: linux bash sed 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 "$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/

3 个答案:

答案 0 :(得分:2)

因为*贪婪。您希望在“UPROC”之后更加选择性地允许使用哪些字符 - 任何非斜杠

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

但是

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

s///命令使用不同的分隔符可以减少“倾斜牙签”问题。

答案 1 :(得分:1)

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

您需要[^/]*代替.才能匹配任何斜杠。

答案 2 :(得分:1)

如果您想知道自己在哪个目录中,为什么不使用pwd

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