如何在sed命令中使用变量

How to use variables in sed command

我有一个名为 "text_file1.txt" 的文件,文件中的内容是 "subject= /C=US/O=AAA/OU=QA/OU=12345/OU=TESTAPP/"

现在我想要实现的是如下内容: "subject= /C=US/O=AAA/$$$QA/###12345/@@@TESTAPP/"

当我执行下面的代码时:

#! /bin/ksh
OU1="QA"
OU2=12345
OU3="TESTAPP"
`sed -i "s/OU=$OU1/$$$${OU1}/g" text_file1.txt`
`sed -i "s/OU=$OU2/###${OU2}/g" text_file1.txt`
`sed -i "s/OU=$OU3/@@@${OU3}/g" text_file1.txt`
content=`cat text_file1.txt`
echo "content:$content"

我得到这样的输出:

content:subject= /C=US/O=Wells Fargo/2865528655{OU1}/###12345/@@@TESTAPP/CN=03032015_CUST_2131_Unix_CLBLABB34C02.wellsfargo.com

只有这个命令“sed -i "s/OU=$OU1/$$$${OU1}/g" text_file1.txt”不起作用,因为expected.Can有人可以对此提出一些想法吗?

提前致谢。

$ 放在双引号内时一定要小心。

sed -i "s/OU=$OU1/"'$$$'"${OU1}/g" text_file1.txt

示例:

$ OU1="QA"
$ echo 'OU=QA' | sed "s/OU=$OU1/"'$$$'"${OU1}/g"
$$$QA

这对开​​始有帮助吗?

echo ''
OU1="QA"
echo "subject= /C=US/O=AAA/OU=${OU1}/OU=12345/OU=TESTAPP/" \
| sed -e "s|/OU=${OU1}/|/OU=$$$${OU1}/|g"

结果是:

subject= /C=US/O=AAA/OU=$$$QA/OU=12345/OU=TESTAPP/

(您混淆了 $ 符号的使用。)

有两点影响:

  1. 如果你想要文字 $ 和 [=55=,你必须在双引号 shell 字符串中转义 $(即使用 $) ]
  2. \$ 内部反引号之前不保留其字面意义(也就是说,内部反引号,$ 变为 $) .

写的时候

`sed -i "s/OU=$OU1/$$$${OU1}/g" text_file1.txt`

因为命令在反引号中,所以您使用命令

生成一个子shell
sed -i "s/OU=$OU1/$$$${OU1}/g" text_file1.txt

由于 $$$$ 在双引号字符串中,变量扩展发生,并且扩展为 $$ 的两次出现(正在执行的 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

无需(可见的)临时文件即可完成全部工作。