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