如何在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/
(您混淆了 $ 符号的使用。)
有两点影响:
- 如果你想要文字
$
和 [=55=,你必须在双引号 shell 字符串中转义 $
(即使用 $
) ]
\
在 $
内部反引号之前不保留其字面意义(也就是说,内部反引号,$
变为 $
) .
写的时候
`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
无需(可见的)临时文件即可完成全部工作。
我有一个名为 "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/
(您混淆了 $ 符号的使用。)
有两点影响:
- 如果你想要文字
$
和 [=55=,你必须在双引号 shell 字符串中转义$
(即使用$
) ] \
在$
内部反引号之前不保留其字面意义(也就是说,内部反引号,$
变为$
) .
写的时候
`sed -i "s/OU=$OU1/$$$${OU1}/g" text_file1.txt`
因为命令在反引号中,所以您使用命令
生成一个子shellsed -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
无需(可见的)临时文件即可完成全部工作。