一些常见问题但无法找到解决方案。
我有一个源文件(python):
MYVARIABLE = 123
OTHERVAR = 23
print str(MYVARIABLE)
我想通过从远程终端将MYVARIABLE的值更改为456来修改文件,而不需要重复进行文本编辑,只需要命令行oneliner。
我猜sed可以通过寻找发生MYVARIABLE的第一行来完成这项工作,删除所有内容并替换为MYVARIABLE = 456
不知道如何做到这一点。 输入
答案 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"