在模式匹配时在段落之前和之后添加单词

时间:2016-05-06 08:11:15

标签: regex awk sed

如果在使用sed或awk进行模式匹配(valid)时,如何在(<\valid>)之前和之后(-LEN)段添加单词?

例如,如果我有以下文件:

field FIELD1
     attributes DATATYPE something ,

field FIELD1-LEN
      attributes DATATYPE something ,

结果如下:

field FIELD1
     attributes DATATYPE something ,
<valid>
field FIELD1-LEN
      attributes DATATYPE something ,
<\valid>

我尝试过这个sed命令,但是我没有得到想要的结果

sed -n   '/\-LEN/,/\ ,/i \<valid>'

3 个答案:

答案 0 :(得分:5)

sed用于单个行的简单替换,全部。除了s,g和p(使用-n)之外,所有sed结构都在20世纪70年代中期被淘汰,当时发明了awk并且经验丰富的UNIX程序员今天只使用它们进行心理练习,而不是用于他们的生产代码。

对于比s/old/new/更复杂的事情,awk解决方案将比同等的sed解决方案更清晰,更简单,更强大,更便携,更高效,更容易增强。

$ awk -v RS= '/-LEN/{$0 = "<valid>\n" $0 "\n</valid>"} 1' file
field FIELD1
     attributes DATATYPE something ,
<valid>
field FIELD1-LEN
      attributes DATATYPE something ,
</valid>

答案 1 :(得分:2)

将记录分隔符设置为段落,并检查记录是否包含LEN

$ awk -v RS= '/LEN/{print "<valid>"} 1; /LEN/{print "</valid>"}' a
field FIELD1
     attributes DATATYPE something ,
<valid>
field FIELD1-LEN
      attributes DATATYPE something ,
</valid>

答案 2 :(得分:0)

这是一个有点复杂的sed脚本:

sed -i 'N;s/\(-LEN\(.\|\n\)*,\)/\1\n<\/value>/g;P;D' fields.txt && sed -i 's/^\(.*-LEN\)/<value>\n\1/g' fields.txt

太糟糕了,我不完全理解第一个正则表达式中N;;P;D的作用。您可以在多行正则表达式here上找到更多信息。

另一个谜团是我无法将两个正则表达式与通常的-e开关结合起来。

所以,这个正则表达式有效,但要小心使用它。