2012-12-23 16 views
11

Próbuję przetworzyć nazwy plików w określonym katalogu. Nazwy plików mają format:Unikalne cięcie z wyjątkiem dwóch ostatnich tokenów

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

muszę wyciąć znaki przy użyciu separatora '_' i trzeba podjąć ciąg z wyjątkiem ostatnich dwóch żetonów. W powyższym przykładzie wynik powinien wynosić token1_token2_token3.

Liczba tokenów nie jest stała. Próbowałem zrobić to za pomocą opcji -f#- polecenia cut, ale nie znalazłem żadnego rozwiązania. Jakieś pomysły?

Odpowiedz

22

z cięcia:

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

rev odwraca każdą linię. The 3- w -f3- oznacza od trzeciego pola do końca linii (która jest początkiem linii od trzeciego do ostatniego pola w nieodwracalnym tekście).

+0

Działa to jak zaklęcie: D I tak, jak zapytano w pytaniu, używa rozkazu cięcia. Wybiorę tę odpowiedź. – user613114

+0

Odpowiedź na moje pytanie http://stackoverflow.com/questions/17644000/how-to-get-second-last-field-from-a-cut-command/17644034?noredirect=1#17644034 też. Dzięki –

+0

Zakochałem się w tej odpowiedzi. Ciągle zapominam o istnieniu rev. – norbitheeviljester

3

To nie może być zrobione z cut, jaki kiedykolwiek można wykorzystać sed lub awk

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

Można użyć POSIX zdefiniowane podstawienia parametru:

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

tylko inny sposób napisać ysth za odpowiedź

echo "t1_t2_t3_tn1_tn2.sh" | rev | cut -d "_" -f1,2 --complement | rev

Powiązane problemy