如何使用 sed 匹配多个模式并更改其中一部分

如何使用 sed 匹配多个模式并更改其中一部分

我的文件中有以下几行:

SUT_INST_PIT=true
SUT_INST_TICS=true
SUT_INST_EXAMPLES=false
SUT_INST_PING=false

如何创建 sed 行来匹配模式SUT_INST_EXAMPLES&SUT_INST_PING并设置falsetrue

我不能简单地替换false为,true因为我不想改变SUT_INST_PITSUT_INST_TICS即使它们是假的!

我现在有两个sed正在运行的命令,但我只想一行!

sed -i "s/SUT_INST_EXAMPLES=false/SUT_INST_EXAMPLES=true/g" <file>
sed -i "s/SUT_INST_PING=false/SUT_INST_PING=true/g" <file>

另一件事是,该sed行应该能够参数化设置false->truetrue-> false,但仅限于SUT_INST_EXAMPLES& SUT_INST_PING

解决方案(根据@RomanPerekhrest)以及如何在发送(期望脚本)中使用它:

send "sed -i 's\/^\\(SUT_INST_EXAMPLES\\|SUT_INST_PING\\)=false\/\\1=true\/' file\r"

答案1

sed方法:

sed -i 's/^\(SUT_INST_EXAMPLES\|SUT_INST_PING\)=false/\1=true/' file

file内容:

SUT_INST_PIT=true
SUT_INST_TICS=true
SUT_INST_EXAMPLES=true
SUT_INST_PING=true

\(SUT_INST_EXAMPLES\|SUT_INST_PING\)- 交替组,匹配字符串开头的SUT_INST_EXAMPLESORSUT_INST_PING


选择呆呆地(GNU awk) 方法:

gawk -i inplace -F'=' -v OFS='=' '$1~/^SUT_INST_(EXAMPLES|PING)/{$2=($2=="false")? "true":"false"}1' file

答案2

您可以简单地切换:

sed -i -E '/^SUT_INST_(PING|EXAMPLES)=/{s/false/true/;t;s/true/false/;}' infile

这将根据当前值更改truefalse或。falsetrue

答案3

sed允许您在每一行上执行多个操作:

sed -e '...' -e '...' file

所以你至少可以将你的两个sed调用合并为一个

sed -i -e 's/^SUT_INST_EXAMPLES=false/SUT_INST_EXAMPLES=true/' \
       -e 's/^SUT_INST_PING=false/SUT_INST_PING=true/' file

要参数化替换,请使用变量:

examples="true"
ping="false"

sed -i -e "s/^SUT_INST_EXAMPLES=.*\$/SUT_INST_EXAMPLES=$examples/" \
       -e "s/^SUT_INST_PING=.*\$/SUT_INST_PING=$ping/" file

上面将无条件地将SUT_INST_EXAMPLES和的值分别设置SUT_INST_EXAMPLES$examples和 的值$ping

相关内容