我需要对一大组文件进行一些更改,但是否进行更改的条件基于上一行的内容:
例子:
<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