Bash 如何使用sed在后面的多行字符串中添加搜索模式?

Bash 如何使用sed在后面的多行字符串中添加搜索模式?,bash,awk,sed,Bash,Awk,Sed,我将此文本存档: <TAG-ONE> multi line text <TAG-TWO> multi line text multi 线 文本 多种 线 文本 我想得到它: <TAG-ONE> multi line text </TAG-ONE> <TAG-TWO> multi line text </TAG-TWO> multi 线 文本 多种 线 文本 请帮我结束这种模式: sed '/^<

我将此文本存档:

<TAG-ONE> multi
 line
 text
<TAG-TWO> multi
 line
 text
multi
线
文本
多种
线
文本
我想得到它:

<TAG-ONE> multi
 line
 text
</TAG-ONE>
<TAG-TWO> multi
 line
 text
</TAG-TWO>
multi
线
文本
多种
线
文本
请帮我结束这种模式:

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

sed'/^/,/^尽管我不认为使用sed或awk解析类似XML的文件是个好主意,但您可以尝试以下方法:

awk ' /^<.*>/{ if(tag != ""){print tag; }; match($0,"^<(.*)>.*",a); tag= "</" a[1] ">";} {print} END{print tag}' mytextfile
awk'/^/{if(tag!=“”){print tag;};match($0,“^.*”,a);tag=“”;}{print}END{print tag}mytextfile
awk中的
match()
函数允许您使用数组
a
从字符串中提取正则表达式

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

awk-v RS=“这可能适合您(GNU-sed):


sed-r'/^.*/&\n需要注意的是,
match
的数组参数是一个仅限于gawk的扩展。使用常规awk,您可以按照
match($0,“^”);tag=“谢谢
awk'/^/{if(tag!=”){print tag;};match($0,“^”);tag“虽然此代码可能会回答问题,但提供有关此代码为什么和/或如何回答问题的附加上下文将显著提高其长期价值。请您的答案添加一些解释。比我的答案更好。我已经做了更多解释。
RS
的技巧很好!
sed -r '/^</{:a;x;/./s/^<([^>]*>).*/&\n<\/\1/p;x;h;d};H;$!d;ba' file