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

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

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

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

Количество жетонов не фиксировано. Я пытался сделать это с опцией -f#- команды cut, но не нашел решения. Есть идеи?


person user613114    schedule 23.12.2012    source источник


Ответы (4)


С вырезом:

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

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

person ysth    schedule 23.12.2012
comment
Это работает как шарм: D И да, как было задано в вопросе, он использует команду cut. Я выберу этот ответ. - person user613114; 23.12.2012
comment
Ответил на мой вопрос stackoverflow.com/questions/17644000/ тоже. Спасибо - person Archit Jain; 15.07.2013
comment
Я влюбился в этот ответ. Я постоянно забываю о существовании rev. - person norbitheeviljester; 14.11.2015
comment
Замечательный! Работал с bash 20 лет, никогда не знал о rev. - person Sasha Pachev; 07.12.2018
comment
что, если вы не знаете, сколько будет токенов, и вам нужны все, кроме последнего? - person Michael; 26.09.2020
comment
@Майкл, тогда сделай | rev | cut -d_ -f2- | rev. 2- второе поле до последнего поля в перевернутом тексте, которое является первым полем до предпоследнего поля в исходном тексте - person ysth; 27.09.2020

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

$ name="t1_t2_t3_tn1_tn2.sh"
$ name=${name%_*_*}
$ echo $name
t1_t2_t3
person Rubens    schedule 23.12.2012

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

sed -r 's/(_[^_]+){2}$//g'
person Shiplu Mokaddim    schedule 23.12.2012

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

эхо "t1_t2_t3_tn1_tn2.sh" |rev| вырезать -d"_" -f1,2 --дополнение | оборот

person Rahul    schedule 18.08.2015