首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sed给出未知命令错误:字符1:未知命令:`'‘

sed给出未知命令错误:字符1:未知命令:`'‘
EN

Stack Overflow用户
提问于 2021-09-28 05:41:58
回答 1查看 47关注 0票数 0

我正在尝试使用sed在一个名为host的文件中进行一些文本处理

代码语言:javascript
运行
复制
cluster_ip = "10.223.10.21"
srv_domain = "service_domain.svc"
cmd = f"'/^.*{srv_domain}/!p;$a'{cluster_ip}'\t{srv_domain}'"

那我就这样叫它

代码语言:javascript
运行
复制
subprocess.call(["/usr/bin/sed", "-i", "-ne", cmd,  "host"])

但是我得到了这个错误:

代码语言:javascript
运行
复制
/usr/bin/sed: -e expression #1, char 1: unknown command: `''

有没有人能告诉我我做错了什么?谢谢

我也尝试过使用fileinput,但我无法将print(f"{cluster_ip}\t{srv_domain}\n")打印到文件中,而是将其打印到控制台。

代码语言:javascript
运行
复制
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): # save lines that do not match
                print(line, end='') # this goes to filename due to inplace=1
        # this is getting printed in console 
        print(f"{cluster_ip}\t{srv_domain}\n")

main()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-28 05:49:32

我想您想要删除第一行并添加最后一行。你不需要保护参数,这已经由subprocess模块完成了。所以你得到的是字面上的引语。

快速修复:

代码语言:javascript
运行
复制
cmd = f"/^.*{srv_domain}/!p;$a{cluster_ip}\t{srv_domain}"

更好的做法是:学习使用python,以避免在脚本中调用sed,并使它们变得复杂且不可移植。这里甚至不需要正则表达式,只需要子字符串搜索(这可以用正则表达式改进以避免子字符串匹配,但这个问题已经存在于原始表达式中)

首先读取您的文件,删除定义srv_domain的行,然后添加最后一行。

如下所示,使用临时文件保存修改后的内容,然后覆盖它:

代码语言:javascript
运行
复制
with open("hosts") as fr,open("hosts2","w") as fw:
    for line in fr:
        if not srv_domain in line:
            fw.write(line)
    fw.write(f"{cluster_ip}\t{srv_domain}\n")

os.remove("hosts")
os.rename("hosts2","hosts")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69356356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档