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

sed执行报字符1未知命令错误及fileinput写入失败问题求助

问题1:subprocess调用sed报错解决

错误原因

  1. 你构造cmd变量时额外加了外层单引号,subprocess使用列表传参时不会经过shell解析引号,这些单引号会被直接作为sed表达式的内容传给sed,导致sed解析时第一个字符就是单引号,触发未知命令报错。
  2. f-string中$a的$会被识别为f-string的变量前缀,无法原样传给sed,导致sed无法识别$a(最后一行追加)的语法。

修正后代码

import subprocess
cluster_ip = "10.223.10.21"
srv_domain = "service_domain.svc"
# 去掉多余单引号,用$$转义输出字面量$
cmd = f"/^.*{srv_domain}/!p;$$a\t{cluster_ip}\t{srv_domain}"
subprocess.call(["/usr/bin/sed", "-i", "-ne", cmd, "host"])

如果需要兼容POSIX标准的sed,可将$$a调整为$$a\\\n。


问题2:fileinput追加内容无法写入文件解决

错误原因

fileinput的inplace模式的stdout重定向仅在文件内容迭代过程中生效,当for循环遍历完所有文件行之后,fileinput内部已经完成临时文件到原文件的替换操作,自动恢复了stdout到默认的控制台输出,所以循环结束后的print语句会输出到控制台而非文件。

修正后代码

最稳妥的方案是在fileinput处理完成后,直接用追加模式写入要添加的内容:

import re
import fileinput
cluster_ip = "123.234.45.5"
srv_domain = "service_domain.svc"
def main():
    pattern = '^.*service_domain.svc'
    filename = "host1"
    matched = re.compile(pattern).search
    with fileinput.FileInput(filename, inplace=1) as file:
        for line in file:
            if not matched(line): # 保留不匹配的行
                print(line, end='')
    # 直接用追加模式写入要添加的内容,逻辑更清晰
    with open(filename, 'a') as f:
        f.write(f"{cluster_ip}\t{srv_domain}\n")

main()

内容的提问来源于stack exchange,提问作者ray an

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:18:04