如何提取test
以下字符串中命名的文件夹?
TRUE|/home/linux/test|(null)|
答案1
Bash 有一种非常简单的方法来匹配路径元素(只要你的路径被定义为变量)参数扩展。
使用${parameter##word}
构造,您可以从行首开始搜索,并删除直到最后一个匹配项的所有内容。对于路径,这将删除除最后一个目录之外的所有内容,如下所示:
path='/path/to/my/stuff'; echo ${path##*/}
输出:
stuff
|(null)|
不过,就你的情况而言,你仍然需要删除最后一部分。在这个特定情况下,你可以进行双参数扩展,如下所示:
path='TRUE|/home/linux/test|(null)|'; path=${path##*/}; echo ${path%%|*}
输出:
test
因此在这种情况下,您首先从头到尾进行匹配/
(使用${path##*/}
),然后从尾到尾进行匹配|
(使用${path%%|*}
)。
这样,您仅使用 Bash 内置功能即可执行大量字符串操作。
答案2
这里已经有两个可行的解决方案,但我只是想指出下面的方法,它可能更多地映射到命令式思维方式。
echo 'TRUE|/home/linux/test|(null)|' | awk -F '|' '{print $2}' | xargs basename
从概念上讲,我们 1) 获取输入的第二个元素,2) 获取该路径的基本名称。
awk -F '|' '{print $2}'
按字符分割|
,并给出第二个元素,即/home/linux/test
。然后,您需要test
从给定的路径中提取,这就是basename
命令所做的。从美学角度来看,额外的操作xargs
很烦人,但这是必要的,因为(据我所知)该basename
命令无法从 读取路径stdin
。
作为用户@Ray 在他们的评论中指出,cut
也能像在同一个解决方案中一样有效awk
。
答案3
如果你想为你的作业获得“额外学分”,那么使用awk
echo 'TRUE|/home/linux/test|(null)|' | awk -F '[|/]' '{print $5}'
该awk
选项-F
定义字段分隔符。当括在括号中时,将和[|/]
定义为字段分隔符。因此将是第五个参数|
/
"test"
'{print $5}'
答案4
从您的问题中无法清楚看出您是想获取绝对路径的第三项还是想获取绝对路径的最后一项。
如果你想获得绝对路径的第三项,您还可以使用以下命令来利用
tr
和cut
:echo 'TRUE|/home/linux/test|(null)|' | tr '|' '/' | cut -d '/' -f 5
tr '|' '/'
转换|
为/
,然后cut -d '/' -f 5
用作/
分隔符(-d '/'
)并输出第5个元素(-f 5
)。如果你想获得绝对路径的最后一项使用
tr
和cut
上面类似的方法,您也可以使用rev
以下命令:echo 'TRUE|/home/linux/test|(null)|' | tr '|' '/' | rev | cut -d '/' -f 3 | rev
tr '|' '/'
转换|
为/
,然后第一个rev
反转字符串,cut -d '/' -f 3
使用/
作为分隔符(-d '/'
)并输出第 3 个元素(-f 3
),最后第二个rev
再次反转字符串。
参考