从字符串中剪切文件夹名称

从字符串中剪切文件夹名称

如何提取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

从您的问题中无法清楚看出您是想获取绝对路径的第三项还是想获取绝对路径的最后一项。

  • 如果你想获得绝对路径的第三项,您还可以使用以下命令来利用trcut

    echo 'TRUE|/home/linux/test|(null)|' | tr '|' '/' | cut -d '/' -f 5
    

    tr '|' '/'转换|/,然后cut -d '/' -f 5用作/分隔符(-d '/')并输出第5个元素(-f 5)。

  • 如果你想获得绝对路径的最后一项使用trcut上面类似的方法,您也可以使用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再次反转字符串。


参考

相关内容