Regex 使用sed查找并替换文件中的字符串

Regex 使用sed查找并替换文件中的字符串,regex,replace,sed,Regex,Replace,Sed,我有一个sublime文本配置文件,当我在学校和家之间移动时,我想更改包控制的代理设置。该文件具有以下结构: { "installed_packages": [ "AdvancedNewFile", "jQuery Snippets pack", "Nettuts+ Fetch", "Package Control", "Theme - Aqua", "Theme - Soda"

我有一个sublime文本配置文件,当我在学校和家之间移动时,我想更改包控制的代理设置。该文件具有以下结构:

{
    "installed_packages":
    [
        "AdvancedNewFile",
        "jQuery Snippets pack",
        "Nettuts+ Fetch",
        "Package Control",
        "Theme - Aqua",
        "Theme - Soda"
    ],
    "http_proxy": "ProxyA:port",
    "https_proxy": "ProxyA:port"
}
现在,我需要用3个值替换
http\u proxy
变量。它可以是ProxyA或ProxyB或“”表示无代理。我希望能够使用
sed
高效地执行此操作。现在假设我想将代理设置为ProxyB。然后我会检查代理是否为空或设置为ProxyA,然后执行查找和替换。因此,可能有3种情况:

  • 当代理设置为“”时,我们需要替换ProxyA、ProxyB
  • 当代理设置为ProxyA时,我们需要为“”ProxyB执行替换
  • 当代理被设置为ProxyB时,我们需要对“”进行替换,即ProxyA

  • 我可以使用两个sed命令来实现这一点。实现这一目标的最有效方式是什么?我认为这可以通过一个sed命令来完成。

    换句话说,这三个值中的哪一个存在并不重要

    sed -r 's/"http(s?)_proxy": "(Proxy[AB])?"/"http\1_proxy": "ProxyA"/' inputfile
    

    将三个可能值中的任何一个替换为
    ProxyA
    。(当然,这意味着它也将用自身替换
    ProxyA
    ,但如果您想将其全部放入一个正则表达式中,则需要进行折衷。)

    我希望命令行语法正确。我从来没有用过这个词。奥多尔8080:啊,我想我知道为什么。我忽略了原始字符串的
    :port
    部分。那部分总是在那里吗?它总是这个字符串吗?如果没有,具体是什么?好的。出现一些语法错误,但您的解决方案有效。唯一的问题是我不能同时处理
    http
    https
    变量。我可以在一个命令中同时处理这两个变量吗?@niversitor8080:A
    使上一个令牌成为可选的,因此
    https?
    将两者都匹配。我已经编辑了我的答案。通过在可选的
    s
    周围添加括号,创建了一个,允许我在表达式的替换部分中使用
    \1
    引用匹配的该部分。其作用类似于charm@Tim。您是否介意向我解释一下
    \1
    开关如何仅与字符串的一部分匹配,而不是与整个匹配匹配?