用bash / sed / awk替换文件中的变量值

时间:2014-07-17 14:32:46

标签: bash variables replace sed

一些常见问题但无法找到解决方案。

我有一个源文件(python):

MYVARIABLE = 123
OTHERVAR = 23
print str(MYVARIABLE)

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

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

不知道如何做到这一点。 输入

8 个答案:

答案 0 :(得分:2)

另一个sed

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

答案 1 :(得分: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变量声明。


如果您有足够的信心替换"就位",请在-i的某些实施中添加sed选项。

来自man sed

   -i[SUFFIX], --in-place[=SUFFIX]

          edit files in place (makes backup if extension supplied)

答案 2 :(得分:1)

通过sed,

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

答案 3 :(得分:1)

使用awk

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

答案 4 :(得分:0)

这个简单的awk应该:

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

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

答案 5 :(得分:0)

$ 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)

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

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