我必须修改参数文件中的一些参数,可能如下所示:
MY_VAR=YES
我想使用`sed并想出了这个:
sed -i 's/MY_VAR=[A-Z]*/MY_VAR=NO/' sed.txt
这似乎有效,现在我也希望它匹配,如果文件看起来像
MY_VAR = YES
或任何其他空白格式,我该怎么做?我尝试过sed -i 's/MY_VAR\s=\s[A-Z]*/MY_VAR=NO/' sed.txt
,但没有成功。我该如何正确地做到这一点?
答案1
似乎你唯一的空白需要要匹配的是变量名和等号之间的内容。等号后面的内容无论如何都会被替换。
使用标准sed
:
sed 's/^\(MY_VAR\)[[:blank:]]*=.*/\1=NO/' params.txt
子[[:blank:]]*
表达式将匹配零个或多个空白字符。 “空白字符”是制表符或空格。替换将以变量名称开头、后跟可选空格和 a 的整行替换=
为变量名称和字符串=NO
。
测试:
$ cat params.txt
MY_VAR=YES
MY_VAR = MAYBE
MY_VAR = OK
$ sed 's/^\(MY_VAR\)[[:blank:]]*=.*/\1=NO/' params.txt
MY_VAR=NO
MY_VAR=NO
MY_VAR=NO
对于文件的就地编辑params.txt
,请-i
根据sed
您使用的内容正确使用(请参阅如何使用 sed -i (就地编辑)实现可移植性?),或使用
cp params.txt params.txt.tmp &&
sed 's/^\(MY_VAR\)[[:blank:]]*=.*/\1=NO/' params.txt.tmp >params.txt &&
rm -f params.txt.tmp
答案2
添加通配符到\s
.这将覆盖零个或多个空间。您的命令将是:
sed -i 's/MY_VAR\s*=\s*[A-Z]*/MY_VAR=NO/' sed.txt