Bash Sed删除xml文件内容,如果!{q100};使用返回

Bash Sed删除xml文件内容,如果!{q100};使用返回,bash,sed,Bash,Sed,我希望在大型xml文件上的bash脚本中运行一个sed命令 sed -i '/$OLD_IP_ADDRESS/!{q100}; {s/$OLD_GATEWAY/$NEW_GATEWAY/}' $system_file 其中,如果存在$OLD\u IP\u地址,我将$OLD\u网关替换为$NEW\u网关(IPs),但如果不存在$OLD\u IP\u地址,则返回100 我使用的是来自 例如 kent$ echo "foo" | sed '/foo/!{q100}; {s/f/b/}'

我希望在大型
xml
文件上的bash脚本中运行一个sed命令

sed -i '/$OLD_IP_ADDRESS/!{q100};  {s/$OLD_GATEWAY/$NEW_GATEWAY/}'   $system_file 
其中,如果存在
$OLD\u IP\u地址
,我将
$OLD\u网关
替换为
$NEW\u网关
(IPs),但如果不存在
$OLD\u IP\u地址
,则返回
100

我使用的是来自

例如

kent$  echo "foo" | sed  '/foo/!{q100}; {s/f/b/}'
boo
kent$  echo $?
0
但是,当我运行该命令时,它会删除整个
xml
,只留下标题行

我已经尝试了许多不同的方法,但不明白/看不出我在哪里空白文件


我已经搜索过,但找不到相关信息,因此非常感谢您的帮助。

正如@potong所说,您不能在多行文件中使用
q
sed选项,因为它将永远失败,除非每行都有您要搜索的内容

如果要搜索是否存在某些内容,可以在执行替换之前使用
grep

你可以这样做:

#!/bin/bash
if grep -q -e "${OLD_IP_ADDRESS}" "${system_file}"; then
   sed -i -e "s/${OLD_GATEWAY}/${NEW_GATEWAY}/" "${system_file}"
else
   exit 100
fi
只有当文件中至少存在一次
${OLD\u IP\u ADDRESS}
时,此代码段才会在每一行中用
${NEW\u GATEWAY}
替换
${OLD\u GATEWAY}
的每次第一次出现(
g
选项未使用)

如果您需要oneliner,您可以使用以下内容:

grep -q -e "${OLD_IP_ADDRESS}" "${system_file}" && sed -i -e "s/${OLD_GATEWAY}/${NEW_GATEWAY}/" "${system_file}"

注意退出代码与
100

不同,上述解决方案适用于一行文件,对于2行或更多行,除非每行都被替换,否则解决方案将始终失败。回到那个解决方案,继续读下去。谢谢你的指点。我将研究一个awk替代方案。如果你想让shell替换变量的值,你也不能使用单引号。有人需要发布一个引号指南,说明你不允许在不理解的情况下编写shell脚本-滥用引号是我看到的最常见的问题来源!您的问题包括简明的、可测试的示例输入(包括那些shell变量的值)和预期的输出,以便我们可以尝试帮助您。非常感谢!!!使用#/bin/bash如果grep-q-e“${OLD_IP_ADDRESS}”${system_file}”;然后sed-i-e“s/${OLD_GATEWAY}/${NEW_GATEWAY}/${system_file}”OLD_ip_present=1 else OLD_ip_present=0 fi我能够对OLD_ip_present=part进行错误检查假设OLD_ip_地址等实际上是ip地址,则需要转义其中的
s`并锚定它们以避免错误匹配。