如果在使用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>'
答案 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
开关结合起来。
所以,这个正则表达式有效,但要小心使用它。