查找并替换为变量

find and replace with variables

我正在尝试查找并替换为变量,但它不起作用。

这是代码。我需要附加 -C -w 10% -c 5% -p /u0 以附加到匹配行的末尾。我不知道如何压制 (-) 有什么想法吗?谢谢。

OLD=$(command[check_disk]=/usr/local/nagios/libexec/check_disk -w 10% -c 5% -p / -p /var -p /tmp -p /home -p /boot -p /usr -A -e)
NEW=$(command[check_disk]=/usr/local/nagios/libexec/check_disk -w 10% -c 5% -p / -p /var -p /tmp -p /home -p /boot -p /usr -A -e -C -w 10% -c 5% -p /u0)

sed -i "s/$OLD/$NEW/" /home/scripts/nrpe.cfg

试试这个(假设 bash):

OLD='command[check_disk]=/usr/local/nagios/libexec/check_disk -w 10% -c 5% -p / -p /var -p /tmp -p /home -p /boot -p /usr -A -e'
NEW='command[check_disk]=/usr/local/nagios/libexec/check_disk -w 10% -c 5% -p / -p /var -p /tmp -p /home -p /boot -p /usr -A -e -C -w 10% -c 5% -p /u0'

oldEscaped=$(sed 's/[^^]/[&]/g; s/\^/\^/g' <<<"$OLD")
newEscaped=$(sed 's/[\&/]/\&/g' <<<"$NEW")

sed -i "s/$oldEscaped/$newEscaped/" /home/scripts/nrpe.cfg
  • 您的第一个问题是 您将 $(...) 误认为是字符串引用机制(不是;它用于 command substitution(执行随附的命令并将构造替换为命令的输出))。
    要分配文字字符串,只需像上面那样使用 单引号
  • 你的第二个问题是 你不能盲目地将字符串传递给 seds(字符串替换)命令,因为某些字符对 sed 有特殊意义,所以要按字面意思 使用它们 它们必须 escaped - 最明显的问题是字符串中的 / 实例,它们被误认为是 s/.../.../ 命令的定界符。
    • 因此,2 个辅助 sed 命令用于执行必要的转义:
      • sed 's/[^^]/[&]/g; s/\^/\^/g' <<<"$OLD"old 字符串进行转义,以便其 none 字符可能被误认为正则表达式定界符或特殊正则表达式字符。
      • sed 's/[\&/]/\&/g' <<<"$NEW"new 字符串进行转义,这样它的 none 字符可能会被误认为正则表达式分隔符或反向引用(例如 &,或 </code>)。 </li> </ul></li> </ul></li> </ul> <p>最后,注意最好<em>不要</em>使用全大写的<em>shell</em>变量名,例如<code>$OLD,以免与环境变量发生冲突。