有两件事在其中发挥着作用:
- 你必须逃脱
$
(即使用\$
) 在双引号 shell 字符串中,如果你想要一个文字$
, and
-
\
当它出现在 a 之前时,不保留其字面意义$
内部反引号(也就是说,内部反引号,\$
变得只是$
).
当你写的时候
`sed -i "s/OU=$OU1/$$$\${OU1}/g" text_file1.txt`
因为该命令是用反引号括起来的,所以您可以使用该命令生成一个子 shell
sed -i "s/OU=$OU1/$$$${OU1}/g" text_file1.txt
Since $$$$
在双引号字符串内,发生变量扩展,并且它被扩展为两次出现$$
(正在执行扩展的 shell 的进程 ID)。这意味着代码sed
最终看到的是
s/OU=QA/1234512345{OU1}/g
...如果生成的子 shell 的进程 ID 是12345
.
在这种特殊情况下,您不需要命令替换(反引号),因此您可以编写
sed -i "s/OU=$OU1/\$\$\$${OU1}/g" text_file1.txt
然而,在 sed 代码中使用 shell 变量始终是一个问题。如果你愿意的话,考虑一下如果OU1
有价值/; e rm -Rf * #
(提示:GNU sed 有一个e
运行 shell 命令的指令)。出于这个原因,我总是更喜欢awk
进行涉及 shell 变量的替换:
cp text_file1.txt text_file1.txt~
awk -v OU1="$OU1" '{ gsub("OU=" OU1, "$$$" OU1) } 1' text_file1.txt~ > text_file1.txt
这通过不处理来避免代码注入问题OU1
作为代码。
如果您有 GNU awk 4.1 或更高版本,
awk -v OU1="$OU1" -i inplace '{ gsub("OU=" OU1, "$$$" OU1) } 1' text_file1.txt
可以在没有(可见的)临时文件的情况下完成整个事情。