查找并替换为变量
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(执行随附的命令并将构造替换为命令的输出))。
要分配文字字符串,只需像上面那样使用 单引号 。
- 你的第二个问题是 你不能盲目地将字符串传递给
sed
的 s
(字符串替换)命令,因为某些字符对 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
,以免与环境变量发生冲突。
我正在尝试查找并替换为变量,但它不起作用。
这是代码。我需要附加 -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(执行随附的命令并将构造替换为命令的输出))。
要分配文字字符串,只需像上面那样使用 单引号 。 - 你的第二个问题是 你不能盲目地将字符串传递给
sed
的s
(字符串替换)命令,因为某些字符对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
,以免与环境变量发生冲突。
- 因此,2 个辅助