如何搜索并有条件地替换为awk或sed?

如何搜索并有条件地替换为awk或sed?,sed,awk,Sed,Awk,包含此内容的文件: var1 = true 如何使用sed/awk切换此值 我查看了组、sed地址……但它没有说明如何保存返回值,如“找到它”或“未找到它”。 搜索替换var1=true到var1=false 编辑:似乎没有写入文件..曾经: sed 's/var1 = true/var1 = foo/g' ./variables1 sed 's/var1 = false/var1 = true/g' ./variables1 sed 's/var1 = foo/var1 = false/g'

包含此内容的文件:

var1 = true
如何使用sed/awk切换此值

我查看了组、sed地址……但它没有说明如何保存返回值,如“找到它”或“未找到它”。 搜索替换
var1=true
var1=false

编辑:似乎没有写入文件..曾经:

sed 's/var1 = true/var1 = foo/g' ./variables1
sed 's/var1 = false/var1 = true/g' ./variables1
sed 's/var1 = foo/var1 = false/g' ./variables1
命令行输出:

var1=foo

var1=真

var1=真

诡异的


edit2:它与sed-i一起使用
gawk
进行就地编辑

捕捉括号:

sed 's/var1 = true/var1 = false/g'
printf "%s\n" "v1 = true" "v2=false" |
gawk '
    match($0, /([[:alnum:]]+)[[:space:]]*=[[:space:]]*(true|false)/, ary) {
        printf("%s = %s\n", ary[1], ary[2] == "true" ? "false" : "true")
    }
'
产生

v1 = false
v2 = true
要写入相同的文件名,请使用以下命令:

filename=./variables1
tmpfile=$(mktemp)   # or use tmpfile="$filename.tmp.$(date +%s).$$"

gawk '...' "$filename" > "$tmpfile" && 
  mv "$filename" "$filename"~ && 
  mv "$tmpfile" "$filename"

如果不想备份文件,请删除第一个
mv

$?将返回最后执行的命令的成功。这将回答您的“找到”或“未找到”请求。对于这个问题,有很多关于stackoverflow和google的sed/awk教程,尽管正如他所问的那样,这并不能取代文件中的值。为他写shell脚本;)哦,对不起,我要走了。将true改为foo,false改为true,foo改为false,然后使用上面我的sed表达式。@Scott hm奇怪,这很有道理,但仍然不起作用。我将编辑我现在的答案。最后一个答案应该是foo到false。