Разрез Unix, кроме двух последних токенов

Я пытаюсь разобрать имена файлов в определенном каталоге. Имена файлов имеют формат:

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

Мне нужно вырезать маркеры, используя разделитель '_', и нужно взять строку, за исключением двух последних токенов. В вышеприведенном примере вывод должен быть token1_token2_token3.

Количество токенов не фиксировано. Я попытался сделать это с помощью опции -f#- команды cut, но не нашел никакого решения. Любые идеи?

Ответ 1

С разрезом:

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

rev меняет направление каждой строки. 3- в -f3- означает от 3-го поля до конца строки (это начало строки через третье-последнее поле в тексте без текста).

Ответ 2

Вы можете использовать подстановку параметров POSIX:

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

Ответ 3

Это невозможно сделать с помощью cut. Как вы можете использовать sed или awk

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

Ответ 4

Просто другой способ написать ysth answer

echo "t1_t2_t3_tn1_tn2.sh" | rev | cut -d "_" -f1,2 - дополнение | ред