查找并替换变量

时间:2015-04-13 01:33:11

标签: variables sed

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

这是代码。我需要附加-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

1 个答案:

答案 0 :(得分:0)

试试这个(假设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(执行所附的命令并替换构造用命令的输出)) 要分配文字字符串,只需使用单引号,如上所述。
  • 你的第二个问题是你不能盲目地将字符串传递给sed的{​​{1}}(字符串替换)命令,因为某些字符对{具有特殊意义} {1}},所以要使用它们字面 它们必须转义 - 最明显的问题是s个实例字符串,被误认为是sed命令的分隔符。
    • 因此,2个辅助/命令用于执行必要的转义:
      • s/.../.../转义字符串,以便其所有字符都不会被误认为是正则表达式分隔符或特殊正则表达式字符。
      • sed转义 new 字符串,以便其所有字符都不会被误认为正则表达式分隔符或反向引用(例如sed 's/[^^]/[&]/g; s/\^/\\^/g' <<<"$OLD"sed 's/[\\&/]/\\&/g' <<<"$NEW") 。

最后,请注意,使用全大写的 shell 变量名称(例如&)更好 ,以避免与环境发生冲突变量。