web-dev-qa-db-fra.com

couper le n dernier caractère d'une chaîne à l'aide d'un script shell

Comment supprimer tous les n caractères d'une chaîne particulière à l'aide de scripts Shell,

ssl01:49188,,,
ssl01:49188,
ssl01:49188,,,,,
ssl01:49188,ssl999999:49188,,,,,
ssl01:49188,abcf999:49188,,,,,

La sortie sera au format suivant 

ssl01:49188
ssl01:49188
ssl01:49188
ssl01:49188,ssl999999:49188
ssl01:49188,abcf999:49188
13
anish

Pour répondre au titre de votre question avec spécifie couper le n dernier caractère d'une chaîne, vous pouvez utiliser la fonctionnalité d'extraction de sous-chaîne de Bash.

me@home$ A="123456"
me@home$ echo ${A:0:-2}  # remove last 2 chars
1234

Cependant, sur la base de vos exemples, vous semblez vouloir supprimer toutes les virgules de fin, auquel cas vous pouvez utiliser sed 's/,*$//'.

me@home$ echo "ssl01:49188,ssl999999:49188,,,,," | sed 's/,*$//'
ssl01:49188,ssl999999:49188

ou, pour une solution purement Bash, vous pouvez utiliser la suppression de sous-chaîne:

me@home$ X="ssl01:49188,ssl999999:49188,,,,,"
me@home$ shopt -s extglob
me@home$ echo ${X%%+(,)}
ssl01:49188,ssl999999:49188

J'utiliserais l'approche sed si la transformation doit être appliquée à un fichier entier, et l'approche de suppression de sous-chaîne bash si la chaîne cible se trouve déjà dans une variable bash.

40
Shawn Chin

Avec sed:

sed 's/,\+$//' file
11
cmbuckley

Je suppose que vous devez supprimer ces , inutiles

sed 's/,,//g;s/\,$//g' your_file

testé:

> cat temp
ssl01:49188,,,
ssl01:49188,
ssl01:49188,,,,,
ssl01:49188,,,
ssl01:49188,
ssl01:49188,,,,,
ssl01:49188,ssl999999:49188,,,,,
ssl01:49188,abcf999:49188,,,,,
> sed 's/,,//g;s/\,$//g' temp
ssl01:49188
ssl01:49188
ssl01:49188
ssl01:49188
ssl01:49188
ssl01:49188
ssl01:49188,ssl999999:49188
ssl01:49188,abcf999:49188
> 
1
Vijay

Utilisation de sed:

sed 's/,,*$//g' file 
1
Guru