You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Docker Compose中执行多行命令?sed报错排查

解决sed命令报错:unknown option to `s'

报错信息

fscrawler | sed: -e expression #2, char 31: unknown option to `s'

原执行命令

command: >
  sh -c "sed -i -e "s/{ELASTIC_PASSWORD}/${ELASTIC_PASSWORD}/g" 
  -e "s/{ELASTICSEARCH_HOST}/${ELASTICSEARCH_HOST}/g" 
  -e "s/{FSCRAWLER_HOST}/${FSCRAWLER_HOST}/g" /root/.fscrawler/job1/_settings.yaml 
  && fscrawler job1 --restart --rest"

问题根源

  1. 引号嵌套解析错误:sh -c后的命令用双引号包裹,内部sed的替换命令又用双引号,shell会提前拆分引号,导致sed表达式被截断,无法正确识别。
  2. 分隔符冲突:sed默认用/作为替换分隔符,如果${ELASTIC_PASSWORD}等变量值中包含/(比如密码带斜杠),会破坏sed的表达式结构,触发未知选项错误。

修复方案

方案1:替换sed分隔符+修正引号嵌套

改用#作为sed的分隔符(选变量值中大概率不会出现的字符),同时用单引号包裹sh -c的整体命令,避免引号解析混乱:

command: >
  sh -c 'sed -i -e "s#{ELASTIC_PASSWORD}#${ELASTIC_PASSWORD}#g" 
  -e "s#{ELASTICSEARCH_HOST}#${ELASTICSEARCH_HOST}#g" 
  -e "s#{FSCRAWLER_HOST}#${FSCRAWLER_HOST}#g" /root/.fscrawler/job1/_settings.yaml 
  && fscrawler job1 --restart --rest'

方案2:调整引号拼接方式(适用于变量不含斜杠的场景)

如果确定变量值里没有/,可以保留/作为分隔符,通过拆分引号来正确传递变量:

command: >
  sh -c "sed -i -e 's/{ELASTIC_PASSWORD}/'"${ELASTIC_PASSWORD}"'/g' 
  -e 's/{ELASTICSEARCH_HOST}/'"${ELASTICSEARCH_HOST}"'/g' 
  -e 's/{FSCRAWLER_HOST}/'"${FSCRAWLER_HOST}"'/g' /root/.fscrawler/job1/_settings.yaml 
  && fscrawler job1 --restart --rest"

核心提示

优先选方案1,因为密码、主机地址这类变量很可能包含特殊字符,换分隔符能从根源避免冲突,稳定性更高。

内容的提问来源于stack exchange,提问作者M. Mariscal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:01:44