web-dev-qa-db-de.com

Wie liest man die Ausgabe von sed in eine Variable ein?

Ich habe eine Variable, die den Wert "abcd.txt" hat.

Ich möchte alles vor dem ".txt" in einer zweiten Variablen speichern und den ".txt" durch ".log" ersetzen.

Ich habe kein Problem damit, den gewünschten Wert wiederzugeben:

a="abcd.txt"

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

Aber wie bekomme ich den Wert "abcd.log" in die zweite Variable?

32
Roger Moore

Sie können command substitution als verwenden:

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

oder der weniger empfohlene Backtick-Weg:

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

Sie können Backticks verwenden, um die Ausgabe eines Befehls einer Variablen zuzuweisen:

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

Vorausgesetzt, Sie verwenden Bash.

Alternativ hat Bash für dieses spezielle Problem selbst Pattern-Matching-Konstrukte:

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

oder

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

Das% im letzten Beispiel stellt sicher, dass nur die letzte .txt-Datei ersetzt wird.

13
Cameron Skinner

wenn Sie Bash/Ksh haben

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

Der einfachste Weg ist

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

Wenn zulässig ist, dass der Dateiname in $a mehr als ein Vorkommen von .txt enthält, verwenden Sie die folgende Lösung. Es ist sicherer. Es ändert nur das letzte Vorkommen von .txt

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