我FILE
在 bash 中有一个变量,我想将RT
其FILE
值替换为TTT
。
运营:
FILE="BlazeRT 123"
source_dir=BlazeRT
target_dir=BlazeTTT
newfile="$(echo ${FILE} | sed -e \"s/${source_dir}/${target_dir}/g\")"
我收到错误:
sed: -e expression #1, char 1: unknown command: `"'
似乎 shell eval 时发生错误echo ${FILE} | sed -e \"s/${source_dir}/${target_dir}/g\"
。
现在,我想知道如何纠正最后一个命令。
提前致谢!
答案1
您尝试运行的代码大约存在四个问题。
- 您正在转义表达式周围的双引号字符
sed
。这样做会使双引号成为sed
尝试运行的表达式的一部分。由于 中没有"
命令sed
,实用程序会抱怨这一点,说“未知命令”。您可以通过不转义双引号来解决此问题。 - 您使用
$FILE
不带引号的。因此,shell 将按字符(默认情况下为空格、制表符和换行符)拆分值$IFS
,并对结果单词执行文件名生成(通配)。您可以通过双引号$FILE
扩展来纠正这个问题。 - 在某些情况下,该实用程序将通过扩展转义序列(例如,如果它们出现在其输出的字符串中)来
echo
修改其输出的数据。因此,如果您想确定它将输出什么,则应该仅在静态字符串上使用。在所有其他情况下,请使用.\t
\n
echo
printf
- 如果或包含斜杠,则该
sed
命令将失败,因为斜杠默认用作命令的分隔符。幸运的是,在该命令中使用任何其他分隔符都很容易,并且您需要选择一个永远不会出现在数据中的分隔符。不幸的是,如果您想将值解释为固定字符串而不是正则表达式,则必须避免使用其他几个子字符串和字符。此外,第二个字符串, 可能不包含,或等子字符串。$source_dir
$target_dir
s///
sed
sed
$target_string
\1
\2
&
在 shell 本身中使用参数替换比尝试sed
在这种情况下使用会更有效、更安全。 shellbash
可以执行诸如${variable//pattern/word}
替换与 shell 模式匹配的所有子字符串之类的pattern
操作$variable
(word
使用单个/
代替 of//
仅替换第一次出现的子字符串)。
newfile=${FILE/"$source_dir"/$target_dir}
我们使用双引号$source_dir
以避免将其值用作通配模式。