sed执行报字符1未知命令错误及fileinput写入失败问题求助
问题1:subprocess调用sed报错解决
错误原因
- 你构造
cmd变量时额外加了外层单引号,subprocess使用列表传参时不会经过shell解析引号,这些单引号会被直接作为sed表达式的内容传给sed,导致sed解析时第一个字符就是单引号,触发未知命令报错。 - 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
相关产品推荐
相关产品推荐

