如何从shell字符串中剪切最后一个字段

30

如何在shell字符串中切割最后一个字段

LINE="/string/to/cut.txt"

以便使字符串看起来像这样

LINE="/string/to/"

提前致谢!

5个回答

74

如果有用的话,一个基于cut的解决方案:

NEW_LINE="`echo "$LINE" | rev | cut -d/ -f2- | rev`/"

我认为这是切掉了第一个字段,而不是最后一个? - Michael
@Michael:我在这里进行了一些测试,看起来它似乎工作正常。它确实切掉了第一个字段,但是它(相当低效地)在之前和之后翻转了字符串,这具有期望的整体效果。 - Lucas Jones
8
我确认这确实可行,在Unix和GNU的cut实现中都一样。显然,dirname的答案对于OP的特定用例更好,但当我在寻找删除最后一个字段的通用方法时,我发现了这个方法。 - jdeuce
1
值得注意的是,对于多行输入,这种方法要比使用“dirname”命令更加高效,因为“dirname”命令一次只能处理一个路径。例如,在“find”命令的输出中,使用“dirname”的替代方法是“find ... -exec dirname {} ;”。而使用“-exec”选项会使其变得非常缓慢。 - Nicole

23

我认为你可以使用"dirname"命令。它接受文件路径作为输入,去掉文件名并返回路径。例如:

$ dirname "/string/to/cut.txt"
/string/to

18

这将在现代 Bourne 版本中有效,如 Dash、BusyBox ash 等,以及 Bash、Korn shell 和 Z shell 等后代版本。

LINE="/string/to/cut.txt"
LINE=${LINE%/*}

或者保留最后的斜杠:

LINE=${LINE%/*}/

这应该是被接受的答案,因为它是最快和最便携的解决方案,它可以在任何符合POSIX标准的shell中工作,而不需要fork - Adrian Frühwirth

1
echo "/string/to/cut.txt" | awk -F'/' '{for (i=1; i<NF; i++) printf("%s/", $i)}'

我们如何使用cut命令来实现这个? - user558134
@user558134 - 不太确定如何为最后一个字段剪切支持变量,awk 更加优雅。 - ajreal
awk以更少的代码更轻松地解决了我的问题,感谢您的提示。 - Michael Tunnell

1

echo $LINE | grep -o '.*/' 也可以。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接