Sed 条件多行更改

Sed 条件多行更改

我需要对一大组文件进行一些更改,但是否进行更改的条件基于上一行的内容:

例子:

<element1>
  <value>true</value>

在这种情况下,我想将该行更改为 true

但如果是如下情况:

<wrong_element>
  <value>true</value>

那么我不想改变它。

我可以让 sed 进行更改,但它会更改所有值。我还可以让它忽略空格,因为不同的文件可能有不同数量的空格

我读 sed 根据行读取和评估,如何根据前一行的内容进行更改?

答案1

这似乎是“awk”而不是“sed”真正擅长的事情:

cat file | awk 'BEGIN {lastLINE="XXX";} \
        { if ( lastLINE ~ /element1/ ) gsub(/BADtextREGexpression/,"replaceTEXT") ; printf("%s\n",$0); lastLINE = $0; }'

如果没有错误,上面的代码将原封不动地打印出所有行,除非最后一行有一个与正则表达式“element1”匹配的片段。在这种情况下,它会在打印之前将“replaceTEXT”全局替换到当前行中(代替 BADtextREG 表达式)。

$0 是一个变量,表示刚刚从输入文件中读取的当前整行,并且是 gsub() 的默认目标。

如果绝对需要“sed”,我不知道该怎么做。
链接到在线“awk”手册:https://www.gnu.org/software/gawk/manual/gawk.html

相关内容