如何将sed的输出读入变量

Rog*_*ore 43 variables shell sed

我有变量有价值"abcd.txt".

我想之前存储的一切".txt"在第二个变量,取代了".txt"".log"

我没有回应所需值的问题:

a="abcd.txt"

echo $a | sed 's/.txt/.log/'
Run Code Online (Sandbox Code Playgroud)

但是如何将值"abcd.log"输入第二个变量?

cod*_*ict 73

您可以使用命令替换:

new_filename=$(echo "$a" | sed 's/.txt/.log/')
Run Code Online (Sandbox Code Playgroud)

或者较少推荐的反推方式:

new_filename=`echo "$a" | sed 's/.txt/.log/'`
Run Code Online (Sandbox Code Playgroud)

  • 甚至更好:`new_filename="$(echo "$a" | sed 's/.txt/.log/')"`(在 Bash 对中,命令替换中的 `" "` 仍然匹配)。 (2认同)

Cam*_*ner 15

您可以使用反引号将命令的输出分配给变量:

logfile=`echo $a | sed 's/.txt/.log/'`
Run Code Online (Sandbox Code Playgroud)

假设你正在使用Bash.

或者,对于这个特殊问题,Bash有自己的模式匹配结构:

stem=$(textfile%%.txt)
logfile=$(stem).log
Run Code Online (Sandbox Code Playgroud)

要么

logfile=$(textfile/%.txt/.log)
Run Code Online (Sandbox Code Playgroud)

最后一个示例中的%将确保仅替换最后一个.txt.


小智 5

最简单的方法是

logfile="${a/\.txt/\.log}"
Run Code Online (Sandbox Code Playgroud)

如果应该允许文件名中$a出现多次.txt,请使用以下解决方案。它更安全。它只改变最后一次出现的.txt

logfile="${a%%\.txt}.log"
Run Code Online (Sandbox Code Playgroud)