sed:-e 表达式 #1,字符 1:未知命令:`"'

sed:-e 表达式 #1,字符 1:未知命令:`"'

FILE在 bash 中有一个变量,我想将RTFILE值替换为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\nechoprintf
  • 如果或包含斜杠,则该sed命令将失败,因为斜杠默认用作命令的分隔符。幸运的是,在该命令中使用任何其他分隔符都很容易,并且您需要选择一个永远不会出现在数据中的分隔符。不幸的是,如果您想将值解释为固定字符串而不是正则表达式,则必须避免使用其他几个子字符串和字符。此外,第二个字符串, 可能不包含,或等子字符串。$source_dir$target_dirs///sedsed$target_string\1\2&

在 shell 本身中使用参数替换比尝试sed在这种情况下使用会更有效、更安全。 shellbash可以执行诸如${variable//pattern/word}替换与 shell 模式匹配的所有子字符串之类的pattern操作$variableword使用单个/代替 of//仅替换第一次出现的子字符串)。

newfile=${FILE/"$source_dir"/$target_dir}

我们使用双引号$source_dir以避免将其值用作通配模式。

相关内容