2012-12-23 13 views
11

Sto cercando di analizzare i nomi dei file in una directory specifica. I nomi dei file sono di formato:Unix ha tagliato tranne gli ultimi due token

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

ho bisogno di tagliare i gettoni utilizzando delimitatore '_', e la necessità di prendere stringa, tranne gli ultimi due gettoni. Nell'output di examlpe sopra dovrebbe essere token1_token2_token3.

Il numero di token non è stato risolto. Ho provato a farlo con l'opzione -f#- del comando cut, ma non ho trovato alcuna soluzione. Qualche idea?

risposta

22

Con taglio:

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

rev inverte ogni riga. Il 3- in -f3- significa dal 3o campo alla fine della riga (che è l'inizio della riga attraverso il penultimo campo nel testo non revocato).

+0

Questo funziona come un incantesimo: D E sì come richiesto nella domanda utilizza il comando di taglio. Sceglierò questa risposta. – user613114

+0

Ho risposto alla mia domanda http://stackoverflow.com/questions/17644000/how-to-get-second-last-field-from-a-cut-command/17644034?noredirect=1#17644034. Grazie –

+0

Mi sono innamorato di questa risposta. Continuo a dimenticare l'esistenza di rev. – norbitheeviljester

3

Non può essere fatto con cut, Come mai è possibile utilizzare sed o awk

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

È possibile utilizzare POSIX definito sostituzione di parametro:

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

solo un modo diverso di scrivere la risposta di ysth

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