我在文件中有这个文字:
<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/}'
答案 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
从字符串中提取正则表达式。
if
和END
语句用于捕获文件的开头和结尾。
答案 2 :(得分:0)
这可能对您有用(GNU sed):
sed -r '/^</{:a;x;/./s/^<([^>]*>).*/&\n<\/\1/p;x;h;d};H;$!d;ba' file
在保留空间中收集标签和以下各行,但首先检查是否存在先前的集合,如果存在,请设置格式并打印结束标签。然后将集合替换为下一个集合的开始。在文件末尾,返回并打印上一个收藏集等。