使用命令行在两个模式中选择文本

时间:2014-06-30 19:53:01

标签: regex awk sed grep

我正在尝试从大文件中提取文本,但我只对两种模式之间的文本感兴趣。

示例文本如下所示:

<account>0409</account><name>Charles</name><type>R</type><accountStatus>active</accountStatus>

我想要的输出应该是名称标签中的文本,之前没有任何内容,之后没有任何内容。例如:

输出:查尔斯

在这种情况下,起始模式为<name>,结束模式为</name>

如何使用grep / sed / awk实现此目的?

2 个答案:

答案 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