Bash – Manipulation continue des chaînes

#!/bin/bash FILE="$(basename "$1")" FILE="${FILE/%.jpeg/.jpg}" 

Est-il possible de coller ces deux lignes ensemble en une seule ligne?

Réponse

FILE=$(basename "${1/%.jpeg/.jpg}") a fonctionné pour moi.

test:

bash-$ ./test.sh /tmp/foo.jpeg foo.jpg 

contenu du script:

bash-$ cat test.sh #!/usr/bin/bash FILE=$(basename "${1/%.jpeg/.jpg}") echo "$FILE" 

Commentaires

  • Puisque les deux lignes sont un peu interchangeables, cette solution est jusquici la plus soignée … Si les lignes ne sont pas ' interchangeables sed sera certainement nécessaire, je suppose.

Réponse

Vous ne pouvez pas » nicher expansions dans bash (ni dans ksh, ash et autres shells en dehors de zsh). Ceci nest quune limitation cosmétique, car comme vous lillustrez, vous pouvez affecter une expression intermédiaire à une variable temporaire. Cest un peu gênant pour les one-liners, mais dans les scripts, cest sans doute mieux pour la lisibilité.

Vous pourriez éviter u chantez lutilitaire externe basename et utilisez une construction de manipulation de chaîne à la place:

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}" 

Ici, il se trouve que vous pouvez réécrivez votre script pour placez la substitution de commande à lextérieur . Ce nest pas un phénomène général, et vous ne gagnez rien dautre quune certaine sensation à une seule ligne.

Zsh, pour le meilleur ou pour le pire, vous permet dimbriquer des extensions:

FILE=${$(basename $1)/%.jpeg/.jpg} # using basename FILE=${${1##*/}/%.jpeg/.jpg} # using string rewriting 

Ou vous pouvez utiliser la construction intégrée de zsh « au lieu de basename:

FILE=${${1:t}/%.jpeg/.jpg} 

Réponse

Jirais pour:

FILE=$(basename $1 .jpeg).jpg 

Le deuxième paramètre du nom de base est un suffixe à supprimer du nom de fichier (voir man basename)

Réponse

Vous pouvez utiliser une seule commande sed comme ci-dessous:

FILE=$(sed "s/.*\///;s/\.jpeg$/.jpg/" <<<"$1") 

Réponse

En intégrant sed, cela devrait faire laffaire:

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)" 

(Cela ne répond pas exactement à votre question car je ne peux pas; je ne sais pas si cest possible.)

Réponse

The Bash fonctionnent avec des noms de variables , il ny a donc aucun moyen dincorporer une commande directement. Lapproche de @sr_ « est une alternative si vous ne vous souciez pas de la fourchette supplémentaire.

Réponse

La ligne

FILE=$(basename "${1/%.jpeg/.jpg}") 

peut être raccourci et rendu plus portable avec

FILE=$(basename "${1%.jpeg}.jpg") 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *