【问题标题】:Replace variable value in file with bash/sed/awk用 bash/sed/awk 替换文件中的变量值
【发布时间】:2014-09-08 11:50:12
【问题描述】:

有点常见的问题,但找不到解决方案。

我有一个源文件(python):

MYVARIABLE = 123
OTHERVAR = 23
print str(MYVARIABLE)

我想通过从远程终端将 MYVARIABLE 的值更改为 456 来修改文件,而无需重复进行文本编辑,只是一个命令行 oneliner。

我猜 sed 可以通过查找 MYVARIABLE 出现的第一行、删除所有内容并替换为 MYVARIABLE = 456 来完成这项工作

但不确定如何做到这一点。 输入?

【问题讨论】:

    标签: bash variables replace sed


    【解决方案1】:

    假设您的sed 版本支持字符类,您可能会这样写:

    sh$ sed -r 's/([[:blank:]]*MYVARIABLE[[:blank:]]*=[[:blank:]]*)[[:digit:]]+/\1456/' file.py
    MYVARIABLE = 456
    OTHERVAR = 23
    print str(MYVARIABLE)
    

    或者

    sh$ sed -r 's/(\s*MYVARIABLE\s*=\s*)[0-9]+/\1456/' file.py
    MYVARIABLE = 456
    OTHERVAR = 23
    print str(MYVARIABLE)
    

    两者都会在变量定义之前保留空格。这很重要,因为缩进在 Python 中很重要。

    但请注意,这是相当脆弱的。一些有效的 python 变量声明可能不会被那个简单的正则表达式正确修改。


    如果您有足够的信心替换“就地”,请添加sed 的某些实现上可用的-i 选项。

    来自man sed

       -i[SUFFIX], --in-place[=SUFFIX]
    
              edit files in place (makes backup if extension supplied)
    

    【讨论】:

      【解决方案2】:

      通过 sed,

      $ sed '/^MYVARIABLE/s/^\(.*=\s*\).*$/\1456/' file
      MYVARIABLE = 456
      OTHERVAR = 23
      print str(MYVARIABLE)
      

      【讨论】:

        【解决方案3】:

        用 awk

        awk '{if (/MYVARIABLE = [0-9]*/){print "MYVARIABLE = 456"}else{print $0}}' file
        MYVARIABLE = 456
        OTHERVAR = 23
        print str(MYVARIABLE)
        

        【讨论】:

          【解决方案4】:

          又一个sed

          sed -r 's|^(MYVARIABLE\s*=\s*).*|\1456|' file
          

          编辑:就像这里的其他答案一样,-i 可以作为选项添加,以便可以就地修改文件。

          【讨论】:

          • 你确定这会起作用吗?我虽然 sed 只采用“基本”PCRE,这意味着 \s 字符类无效,括号需要反斜杠转义。
          • @djhaskin987 当然可以:-r, --regexp-extended use extended regular expressions in the script.
          • 酷! +1 我不知道。
          • 要更改文件,您应该在 sed 中添加 -i 选项。
          【解决方案5】:

          这个简单的awk 应该这样做:

          awk '/^MYVARIABLE/ {$3="456"}1' file
          MYVARIABLE = 456
          OTHERVAR = 23
          print str(MYVARIABLE)
          

          如果行以MYVARIABLE 开头,则将第三个字段更改为456
          1 打印所有行。

          【讨论】:

            【解决方案6】:
            $ awk -v var="MYVARIABLE" -v val="456" '$1==var{$NF=val} 1' file
            MYVARIABLE = 456
            OTHERVAR = 23
            print str(MYVARIABLE)
            
            $ awk -v var="OTHERVAR" -v val="123456" '$1==var{$NF=val} 1' file
            MYVARIABLE = 123
            OTHERVAR = 123456
            print str(MYVARIABLE)
            

            【讨论】:

              【解决方案7】:

              使用sed,我们可以将一条语句一分为二 - 并将第二部分替换为所需的变量 [此处为 456]。

              sed -i "s#\(.*MYVARIABLE =\)\( .*\)#\1 "456"#" file

              【讨论】:

                【解决方案8】:

                此解决方案限制了给定部分的更改,这通常用于 ini 文件。

                sed -ri '/'$SECTION'/,/\[/ s/(\s*'$KEY'\s*=\s*).+/\1'$VALUE'/' "$INI_FILE"
                

                【讨论】:

                  猜你喜欢
                  • 2011-12-02
                  • 2021-11-20
                  • 1970-01-01
                  • 2011-08-18
                  • 1970-01-01
                  • 2020-01-17
                  • 2020-02-03
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多