我正在尝试从大文件中提取文本,但我只对两种模式之间的文本感兴趣。
示例文本如下所示:
<account>0409</account><name>Charles</name><type>R</type><accountStatus>active</accountStatus>
我想要的输出应该是仅名称标签中的文本,之前没有任何内容,之后没有任何内容。例如:
输出:查尔斯
在这种情况下,起始模式为<name>
,结束模式为</name>
如何使用grep / sed / awk实现此目的?
答案 0 :(得分:2)
将GNU awk用于多字符RS:
$ awk -v RS='</?name>' '!(NR%2)' file
Charles
无论输入文件中的任何位置是否有换行符,无论在一行上显示多少次<name>...</name>
或跨行分割多少次,上述内容都会有效,只需要<name>
和{{ 1}}总是在输入文件中显示为对:
</name>
如果您想从名称中删除任何前导/尾随空白区域,那么这只是一个简单的调整:
$ cat file
<name>Charles</name><name>William</name>
<name>Edward
</name>
<name> John Boy Walton </name>
$ awk -v RS='</?name>' '!(NR%2)' file
Charles
William
Edward
John Boy Walton
答案 1 :(得分:1)
使用awk
awk -F"<|>" '/name/ {print $3}' file
Charles
如果所有数据都在一行上,请执行以下操作:
awk -v RS="<" -F\> '/name/{print $2;exit}' file
Charles