22

我正在尝试解析特定目录中的文件名。文件名的格式为:

token1_token2_token3_token(N-1)_token(N).sh

我需要使用 delimiter 切割标记'_',并且需要获取除最后两个标记之外的字符串。在上面的示例中,输出应该是token1_token2_token3.

令牌的数量不是固定的。我试过用命令-f#-选项来做cut,但没有找到任何解决方案。有任何想法吗?

4

4 回答 4

44

带切割:

$ echo t1_t2_t3_tn1_tn2.sh | rev | cut -d_ -f3- | rev
t1_t2_t3

rev 反转每一行。3-in表示从第-f3-3 个字段到行尾(即在未反转文本中通过倒数第三个字段的行开头)。

于 2012-12-23T11:08:18.673 回答
7

您可以使用 POSIX 定义的参数替换:

$ name="t1_t2_t3_tn1_tn2.sh"
$ name=${name%_*_*}
$ echo $name
t1_t2_t3
于 2012-12-23T11:17:27.953 回答
5

它不能用 来完成cut,但是,你可以使用sed

sed -r 's/(_[^_]+){2}$//g'
于 2012-12-23T11:06:40.600 回答
1

只是写ysth答案的另一种方式:

echo "t1_t2_t3_tn1_tn2.sh" |rev| cut -d"_" -f1,2 --complement | rev
于 2015-08-18T10:10:31.857 回答