我如何使用sed在多行字符串中添加搜索模式?

时间:2016-03-29 06:09:52

标签: bash awk sed

我在文件中有这个文字:

<TAG-ONE> multi
 line
 text
<TAG-TWO> multi
 line
 text

我想得到它:

<TAG-ONE> multi
 line
 text
</TAG-ONE>
<TAG-TWO> multi
 line
 text
</TAG-TWO>

请帮我结束这种模式:

sed '/^<[A-Z-]*>/,/^</{s/^<\([A-Z-]*\)>/&\n\1/}'

3 个答案:

答案 0 :(得分:2)

OR

awk -v RS="<" 'NR!=1{print "<"$0"</"$1}'

RS是记录分离者。它允许读取多行记录。

NR=1跳过第一条记录(在给定示例中为空)

print语句打印多行记录(2 <之间的内容)并添加记录分隔符后面的标记名$1

答案 1 :(得分:1)

尽管我不相信使用sed或awk解析XML文件是一个好主意,但您可以尝试以下方法:

awk ' /^<.*>/{ if(tag != ""){print tag; }; match($0,"^<(.*)>.*",a); tag= "</" a[1] ">";} {print} END{print tag}' mytextfile

awk中的match()函数允许您使用数组a从字符串中提取正则表达式。

ifEND语句用于捕获文件的开头和结尾。

答案 2 :(得分:0)

这可能对您有用(GNU sed):

sed -r '/^</{:a;x;/./s/^<([^>]*>).*/&\n<\/\1/p;x;h;d};H;$!d;ba' file

在保留空间中收集标签和以下各行,但首先检查是否存在先前的集合,如果存在,请设置格式并打印结束标签。然后将集合替换为下一个集合的开始。在文件末尾,返回并打印上一个收藏集等。