Couper une chaîne jusqu’au 4ème délimiteur du côté droit

J’ai des chaînes comme suit qui doivent être analysées avec une seule commande unix (bash)

49_sftp_mac_myfile_simul_test_9999_4000000000000001_2017-02-06_15-15-26.49.csv.failed 

Je veux couper les cordes comme ci-dessus jusqu’à 4e soulignement de l’extrémité / côté droit. Donc, la sortie devrait être

 49_sftp_mac_myfile_simul_test 

Nombre de traits de soulignement peuvent varier dans la chaîne globale. Par exemple, la chaîne pourrait être

 49_sftp_simul_test_9999_4000000000000001_2017-02-06_15-15-26.49.csv.failed 

La sortie devrait être (après avoir réduit jusqu’à la 4ème occurrence du trait de soulignement à partir de la droite).

 49_sftp_simul_test 

Facilement fait en utilisant awk qui décrémente NF ie non. de champs à -4 après la définition du séparateur de champ d’entrée + de sortie en tant que trait de soulignement:

 s='49_sftp_mac_myfile_simul_test_9999_4000000000000001_2017-02-06_15-15-26.49.csv.failed' awk 'BEGIN{FS=OFS="_"} {NF -= 4; $1=$1} 1' <<< "$s" 49_sftp_mac_myfile_simul_test 

Vous pouvez utiliser l’ extension des parameters de bash pour cela:

 ssortingng="..." echo "${ssortingng%_*_*_*_*}" 

Avec GNU sed:

 $ sed -E 's/(_[^_]*){4}$//' <<< "49_sftp_mac_myfile_simul_test_9999_4000000000000001_2017-02-06_15-15-26.49.csv.failed" 49_sftp_mac_myfile_simul_test 

À la fin de la ligne, supprime 4 occurrences de _ suivies de caractères non _ .

Perl one-liner

 echo $your-ssortingng | perl -lne '$n++ while /_/g; print join "_",((split/_/)[-$n-1..-5])' 

consortingbution

 49_sftp_mac_myfile_simul_test_9999_4000000000000001_2017-02-06_15-15-26.49.csv.failed 

le résultat
49_sftp_mac_myfile_simul_test

consortingbution

 49_sftp_simul_test_9999_4000000000000001_2017-02-06_15-15-26.49.csv.failed 

le résultat

49_sftp_simul_test

Pas le plus rapide mais peut-être le plus facile à retenir et le plus amusant:

 echo "49_sftp_mac_myfile_simul_test_9999_4000000000000001_2017-02-06_15-15-26.49.csv.failed"| rev | cut -d"_" -f5- | rev