【发布时间】:2011-04-30 04:03:05
【问题描述】:
我有一个值为"abcd.txt"的变量。
我想将".txt" 之前的所有内容存储在第二个变量中,将".txt" 替换为".log"
回显所需的值没有问题:
a="abcd.txt"
echo $a | sed 's/.txt/.log/'
但是如何将值 "abcd.log" 放入第二个变量中?
【问题讨论】:
我有一个值为"abcd.txt"的变量。
我想将".txt" 之前的所有内容存储在第二个变量中,将".txt" 替换为".log"
回显所需的值没有问题:
a="abcd.txt"
echo $a | sed 's/.txt/.log/'
但是如何将值 "abcd.log" 放入第二个变量中?
【问题讨论】:
最简单的方法是
logfile="${a/\.txt/\.log}"
如果应该允许$a 中的文件名出现不止一次.txt,请使用以下解决方案。它更安全。它只会更改最后一次出现的.txt
logfile="${a%%\.txt}.log"
【讨论】:
如果你有 Bash/ksh
$ var="abcd.txt"
$ echo ${var%.txt}.log
abcd.log
$ variable=${var%.txt}.log
【讨论】:
您可以使用反引号将命令的输出分配给变量:
logfile=`echo $a | sed 's/.txt/.log/'`
假设您使用的是 Bash。
另外,对于这个特殊问题,Bash 本身具有模式匹配结构:
stem=$(textfile%%.txt)
logfile=$(stem).log
或
logfile=$(textfile/%.txt/.log)
最后一个示例中的 % 将确保仅替换最后一个 .txt。
【讨论】:
您可以将command substitution 用作:
new_filename=$(echo "$a" | sed 's/.txt/.log/')
或不太推荐的反引号方式:
new_filename=`echo "$a" | sed 's/.txt/.log/'`
【讨论】:
new_filename="$(echo "$a" | sed 's/.txt/.log/')"(在 Bash 对中的 " " 内部命令替换仍然匹配)。