【问题标题】:Using sed to replace text between strings使用 sed 替换字符串之间的文本
【发布时间】:2018-01-03 09:11:43
【问题描述】:

我正在尝试使用 sed 将文件中的 a.mysql.com 替换为以下行

    'ENGINE': 'a.mysql.com', # MySQL host

如何在不删除评论条目的情况下替换文本?

我尝试了以下方法,但它不起作用

sed -i -e "s/\('ENGINE': ').*\([^']*\)/\1new.mysql.com\2/g" file.py

【问题讨论】:

    标签: sed


    【解决方案1】:

    关注sed 可能对您有所帮助。

    sed "s/\(.*: \)\('.*'\)\(.*\)/\1'my_next_text'\3/"   Input_file
    

    输出如下。

    'ENGINE': 'my_next_text', # MySQL host
    

    编辑: 也用 OP 的编辑 Input_file 对其进行了测试,如下所示。

    cat Input_file
        'ENGINE': 'a.mysql.com', # MySQL host
    
    sed "s/\(.*: \)\('.*'\)\(.*\)/\1'my_next_text'\3/" Input_file
        'ENGINE': 'my_next_text', # MySQL host
    

    EDIT2: 如果 OP 想要检查其中包含字符串 ENGINE 的行,则可以执行以下操作。

    sed "/    'ENGINE/s/\(.*: \)\('.*'\)\(.*\)/\1'my_next_text'\3/"   Input_file
    

    【讨论】:

    • 这给了我 'ENGINE': 'my_next_text'.,而不是预期的输出
    • @Anon,我在发布之前测试了我的代码,它给了我正确的输出,您能否确认您的 Input_file 是否与发布的相同?
    • @Anon,我也检查了您编辑的 Input_file,我的代码在其中也可以正常工作,请您检查并告诉我。如果您仍然没有看到正确的输出,请在代码标签中提及有关 Input_file 和预期输出的完整详细信息,并让我们知道。
    • 我已经更新了我的问题,引擎是一个对象对象中的一个键,它前面有一个制表符空间。
    • @Anon,如果您想查找其中包含字符串 ENGINE 的行并执行某些操作,那么我的 EDIT2 代码可能会对您有所帮助。
    【解决方案2】:

    您可以使用以下逻辑使用 GNU sed 来实现您的要求。

    sed "/ENGINE/s/'[^']*'/'new.mysql.com'/2" file 
    

    s/ENGINE/ 匹配任何包含 ENGINE 的行并执行以下替换 s/'[^']*'/'new.mysql.com'/2 其中:

    s/                # Substitute  
    '                 # Match a single quote
    [^']*             # Match anything not a single quote 
    '                 # Match the closing single quote 
    /                 # Replace with 
    'new.mysql.com'   # The literal value
    /2                # The 2 here matches the second quoted string, not the first. 
    

    适当修改文件后添加-i 扩展名。

    【讨论】:

    • 这给出了'ENGINE':'new.mysql.com'。不是“引擎”:“new.mysql.com”,#MySQl 主机
    • @Anon:答案已在本地测试,它为我提供了正确的'ENGINE': 'new.mysql.com', # MySQL host。要么你运行错误,要么有一个单独的输入文件,而不是问题中发布的文件
    • 是的,我查过了。在我的文件中,ENGINE 是对象对象中的一个键,由制表符缩进。你能解释一下为什么在你的答案中添加 * ,比如 sed -i "/*ENGINE/s/'[^']*'/'new.mysql.com'/2" common_settings.py 不起作用?跨度>
    猜你喜欢
    • 2018-08-29
    • 2021-07-23
    • 2015-02-26
    • 2012-12-07
    • 2015-04-08
    • 1970-01-01
    • 2022-10-24
    • 2023-02-04
    • 1970-01-01
    相关资源
    最近更新 更多