rc文件中多sed命令执行如何避免匹配失败时中断后续操作
解决sed批量替换中途中断的问题
你遇到的问题根源是:sed在未匹配到指定pattern时会返回非0退出码,如果你的shell环境开启了set -e(即命令执行失败就终止后续脚本),就会导致后续sed命令停止执行。下面给两种可行的解决办法:
方法一:强制每条命令继续执行
不管前一条sed是否匹配成功,都让后续命令正常执行,有两种实现方式:
给每条sed命令追加
|| true,强制让整条命令的退出码为0,避免触发set -e的终止逻辑:sed -i "pattern\[0\]/sub\[0\]/g" my_file || true sed -i "pattern\[1\]/sub\[1\]/g" my_file || true sed -i "pattern\[2\]/sub\[2\]/g" my_file || true ... sed -i "pattern\[n\]/sub\[n\]/g" my_file || true如果你的rc文件或shell默认开启了
set -e,可以在文件开头先关闭这个选项,执行完所有替换后再恢复(如果需要的话):# 关闭"命令失败即终止"的选项 set +e sed -i "pattern\[0\]/sub\[0\]/g" my_file sed -i "pattern\[1\]/sub\[1\]/g" my_file ... sed -i "pattern\[n\]/sub\[n\]/g" my_file # 若需要恢复原有环境,重新开启set -e set -e
方法二:先检查pattern存在再执行替换
先通过grep检查文件中是否存在目标pattern,只有存在时才执行对应的sed替换,从根源避免出现非0退出码:
if grep -q "pattern\[0\]" my_file; then sed -i "pattern\[0\]/sub\[0\]/g" my_file fi if grep -q "pattern\[1\]" my_file; then sed -i "pattern\[1\]/sub\[1\]/g" my_file fi ... if grep -q "pattern\[n\]" my_file; then sed -i "pattern\[n\]/sub\[n\]/g" my_file fi
grep -q会静默检查匹配,只返回退出码,不会输出内容,适合做条件判断。
内容的提问来源于stack exchange,提问作者Lyle Shao
相关产品推荐
相关产品推荐

