Linux 除最后两个令牌外的Unix剪切

Linux 除最后两个令牌外的Unix剪切,linux,bash,unix,token,cut,Linux,Bash,Unix,Token,Cut,我正试图解析特定目录中的文件名。文件名的格式为: token1_token2_token3_token(N-1)_token(N).sh 我需要使用分隔符'.剪切令牌,并且需要获取除最后两个令牌之外的字符串。在上例中,PE输出应该是token1\u token2\u token3 令牌的数量不是固定的。我曾尝试使用cut命令的-f#-选项来执行此操作,但没有找到任何解决方案。有什么想法吗?用cut是做不到的,无论你如何使用sed或awk sed -r 's/(_[^_]+){2}$//g'

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

token1_token2_token3_token(N-1)_token(N).sh
我需要使用分隔符
'.
剪切令牌,并且需要获取除最后两个令牌之外的字符串。在上例中,PE输出应该是
token1\u token2\u token3


令牌的数量不是固定的。我曾尝试使用
cut
命令的
-f#-
选项来执行此操作,但没有找到任何解决方案。有什么想法吗?

cut
是做不到的,无论你如何使用
sed
awk

sed -r 's/(_[^_]+){2}$//g'
带切口:

$ echo t1_t2_t3_tn1_tn2.sh | rev | cut -d_ -f3- | rev
t1_t2_t3
rev反转每一行。
-f3-
中的
3-
表示从第三个字段到行尾(从行首到未反转文本中的第三个到最后一个字段)。

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

$ name="t1_t2_t3_tn1_tn2.sh"
$ name=${name%_*_*}
$ echo $name
t1_t2_t3

只是写伊斯特答案的另一种方式


echo“t1_t2_t3_tn1_tn2.sh”| rev | cut-d”|-f1,2--complete | rev

这就像一个符咒:d和yes,如问题中所问,它使用cut命令。我会选择这个答案。我也回答了我的问题。谢谢,我爱上了这个答案。我一直忘了牧师的存在,太棒了!在bash工作了20年,从来都不知道rev.如果你不知道会有多少代币,你想要除了最后一个以外的所有代币怎么办?