Как читать вывод sed в переменную

У меня есть переменная, которая имеет значение "abcd.txt".

Я хочу сохранить все до ".txt" во второй переменной, заменив ".txt" на ".log"

У меня нет проблем с эхом требуемого значения:

a="abcd.txt"

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

Но как мне получить значение "abcd.log" во вторую переменную?

Ответ 1

Вы можете использовать замену команд как:

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

или менее рекомендуемый обратный путь:

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

Ответ 2

Вы можете использовать backticks для назначения вывода команды переменной:

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

Предположим, вы используете Bash.

В качестве альтернативы, для этой конкретной проблемы Bash существуют сами конструкции построения шаблонов:

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

или

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

В последнем примере% будет гарантировать замену только последнего .txt.

Ответ 3

если у вас есть Bash/ksh

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

Ответ 4

Самый простой способ -

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

Если допустимо, что имя файла в $a имеет более одного вхождения .txt в нем, используйте следующее решение. Это более безопасно. Это только изменяет последнее вхождение .txt

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