2010-04-21 3 views
7

Comment puis-je supprimer des parties d'une chaîne jusqu'à un certain caractère?Comment faire pour supprimer la section principale dans bash

Ex.) Si j'ai la chaîne testFile.txt.1 et testFile.txt.12345, comment puis-je supprimer le 1 et 12345?

EDIT: Je voulais enlever et jeter la première partie d'une chaîne jusqu'à un certain caractère et en garder la fin.

+0

La question est un peu floue - pourriez-vous s'il vous plaît clarifier le "supprimer des parties d'une chaîne jusqu'à un certain caractère?"; L'exemple peut être interprété de plusieurs façons et, pour être honnête, la plupart d'entre eux sont pour "enlever après un certain caractère" et non "jusqu'à". – DVK

Répondre

11

en utilisant seulement des installations bash

$ s=testFile.txt.1 
$ echo ${s%.*} 
testFile.txt 

$ s=testFile.txt.12345 
$ echo ${s%.*} 
testFile.txt 

pour enlever avant zéro

$ echo ${s#*.} 
txt.12345 

Autre méthode, vous pouvez diviser votre chaîne en utilisant IFS

$ s=testFile.txt.12345 
$ IFS="." 
$ set -- $s 
$ echo $1 
testFile 
$ echo $2 
txt 
$ echo $3 
12345 
1

Si vous voulez juste supprimer un suffixe connu à partir d'un nom de fichier, vous pouvez utiliser basename:

basename testFile.txt.1 .1 
basename testFile.txt.12345 .12345 
+0

Existe-t-il un moyen élégant de supprimer également cette période de pointe dans la même ligne? Je peux le faire en deux, j'étais juste curieux ... Merci beaucoup pour votre aide! –

+0

Je ne suis pas sûr de quelle période principale vous parlez –

1

Vous pouvez utiliser sed pour faire une recherche et remplacer. L'opérateur <<< transmettra une chaîne sur stdin.

$ sed 's/\.[0-9]*$//' <<< "testFile.txt.1" 
testFile.txt 
$ sed 's/\.[0-9]*$//' <<< "testFile.txt.12345" 
testFile.txt 
+0

notez que si vous traitez beaucoup de fichiers, cela prendra sensiblement plus de temps que les solutions "pur bash" s'il lance un nouveau processus ('sed') pour chacun. – drevicko

0

La question est un peu flou - l'exemple e fourni peut signifier que vous voulez supprimer tous les #, ou retirer la pièce après le dernier ".", ou retirer la pièce après le premier "1", ou même supprimer tous les caractères après le caractère 13. Veuillez clarifier.

Si vous voulez dire que vous voulez supprimer N premiers caractères dans une chaîne (par exemple « jusqu'à un caractère # 13 »), faire echo testFile.txt.1 | cut -c14-. Pour conserver les caractères 1 à 13, par contre echo testFile.txt.1 | cut -c1-13

Si vous voulez dire que vous voulez supprimer les caractères de début jusqu'à la première occurrence d'un caractère spécifique (dans votre exemple, cela semble être "1") , faites echo testFile.txt.1 | perl -e 's/^[^1]*//;'. Pour supprimer tout ce qui suit le premier « 1 », faire echo testFile.txt.1 | perl -e 's/1.*$//;'

Si vous voulez supprimer tous les # s, faire echo testFile.txt.1 | perl -e 's/\d//g;' ou sans Perl, echo testFile.txt.1 | tr -d "[0-9]"

Si vous souhaitez supprimer tout ce qui suit le dernier « », faire echo testFile.txt.1 | perl -e 's/\.[^.]+/./;'

+0

Pourquoi le vote négatif? – DVK

0
# remove string prefix up to the first digit 
var='testFile.txt.12345' 
var='test1File.txt.12345' 
var='testFile.txt.1' 
var='testFile.txt' 

echo "${var#"${var%%[[:digit:]]*}"}" 
Questions connexes