web-dev-qa-db-fra.com

Comment lire la sortie de sed dans une variable

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

Je veux tout stocker avant le ".txt" dans une seconde variable, en remplaçant le ".txt" par ".log"

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

a="abcd.txt"

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

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

32
Roger Moore

Vous pouvez utiliser substitution de commande comme:

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

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

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

Vous pouvez utiliser des backticks pour assigner le résultat d'une commande à une variable:

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

Cela suppose que vous utilisez Bash.

Alternativement, pour ce problème particulier, Bash a des structures de correspondance de modèle:

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

ou

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

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

13
Cameron Skinner

si vous avez bash/ksh

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

Le plus simple est

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

S'il est permis que le nom de fichier dans $a ait plusieurs occurrences de .txt, utilisez la solution suivante. C'est plus sûr. Cela ne change que la dernière occurrence de .txt

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