65 votes

Comment lire la sortie de sed dans une variable

J'ai une variable qui a une valeur "abcd.txt" .

Je veux tout stocker avant le ".txt" dans une deuxième variable, en remplaçant le ".txt" con ".log"

Je n'ai aucun problème à obtenir la valeur souhaitée :

a="abcd.txt"

echo $a | sed 's/.txt/.log/'

Mais comment obtenir la valeur "abcd.log" dans la deuxième variable ?

104voto

codaddict Points 154968

Vous pouvez utiliser substitution de commande comme :

new_filename=$(echo "$a" | sed 's/.txt/.log/')

ou la méthode moins recommandée du backtick :

new_filename=`echo "$a" | sed 's/.txt/.log/'`

21voto

Cameron Skinner Points 19987

Vous pouvez utiliser des antisèches pour affecter la sortie d'une commande à une variable :

logfile=`echo $a | sed 's/.txt/.log/'`

Cela suppose que vous utilisiez Bash.

Par ailleurs, pour ce problème particulier, Bash dispose lui-même d'un système de recherche de motifs :

stem=$(textfile%%.txt)
logfile=$(stem).log

o

logfile=$(textfile/%.txt/.log)

Le % dans le dernier exemple garantit que seul le dernier fichier .txt est remplacé.

5voto

ikke dus Points 76

La méthode la plus simple est la suivante

logfile="${a/\.txt/\.log}"

S'il est permis d'autoriser que le nom de fichier dans $a a plus d'une occurrence de .txt dans celui-ci, utilisez la solution suivante. Elle est plus sûre. Elle ne modifie que la dernière occurrence de .txt

logfile="${a%%\.txt}.log"

3voto

ghostdog74 Points 86060

Si vous avez Bash/ksh

$ var="abcd.txt"
$ echo ${var%.txt}.log
abcd.log
$ variable=${var%.txt}.log

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X