【问题标题】:How to use variables in sed command如何在 sed 命令中使用变量
【发布时间】:2022-01-08 03:13:56
【问题描述】:

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

现在我想要实现的内容如下: "主题= /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”没有按预期工作。有人可以就此提出一些想法吗?

提前致谢。

【问题讨论】:

  • 您还可以通过仅编写 1 个 sed 并在为您的 $ 应用 @AvinashRaj 解决方案并返回 tik 后将每个 s///; 分开来进行优化

标签: bash shell sed


【解决方案1】:

$ 放在双引号内时必须小心。

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

示例:

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

【讨论】:

    【解决方案2】:

    这对开始有帮助吗?

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

    结果是:

    主题= /C=US/O=AAA/OU=$$$QA/OU=12345/OU=TESTAPP/

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

    【讨论】:

      【解决方案3】:

      这有两个原因:

      1. 如果您想要文字 $,则必须在双引号外壳字符串中转义 $(即使用 \$),并且
      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 有一个运行 shell 命令的e 指令)。出于这个原因,我总是更喜欢 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
      

      无需(可见)临时文件即可完成所有工作。

      【讨论】:

        猜你喜欢
        • 2013-10-09
        • 2012-06-24
        • 2018-09-16
        • 2022-10-07
        • 1970-01-01
        相关资源
        最近更新 更多