在Linux Grep命令的字符串之间匹配任何内容

时间:2016-10-14 18:56:12

标签: regex linux bash grep pattern-matching

我已阅读帖子grep all characters including newline,但我没有使用XML,因此我的Linux命令略有不同。

我有以下数据:

cat file.txt | grep -o '<tag.*tag>\|^--.*'

使用此命令<tag>Example line 1</tag> 我得到:

<tag>Example line 1</tag>
<tag>Example line 2</tag>

但是,我希望输出为:

<tag

如何匹配字符串之间的任何内容,包括换行符?

注意:我需要使用tag>和{{1}}作为字符串,因为其他文件可以在行之间包含多个标记和文本。将更新样本数据以显示。

2 个答案:

答案 0 :(得分:1)

gnu-awk使用</tag>作为记录分隔符,这样做更容易:

awk -v RS='</tag>' 'RT {gsub(/\n/, ""); print $0 RT}' file

<tag>Example line 1</tag>
<tag>Example line 2</tag>

答案 1 :(得分:0)

考虑这个测试文件:

$ cat file2
Example line 0</span>
<tag>Example line 1</tag>
<span>Example line 1.5</span>
<tag>
Example line 2
</tag>
Example line 3
<span>Example line 4</span>

这会产生你想要的输出(需要GNU sed):

$ sed -z 's|\n||g; s|</tag>|&\n|g; s|[^\n]*<tag>|<tag>|; s|\n[^\n]*<tag>|\n<tag>|g; s|\n[^\n]*$|\n|' file2
<tag>Example line 1</tag>
<tag>Example line 2</tag>

限制:请注意,使用非专业工具处理类似XML的文本可能非常脆弱