2016-10-14 77 views
1

我已閱讀帖子grep all characters including newline但我沒有使用XML,所以它與我的Linux命令有點不同。匹配任何字符串之間的Linux Grep命令

我有以下數據:

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> 

使用此命令cat file.txt | grep -o '<tag.*tag>\|^--.*'我得到:

<tag>Example line 1</tag> 

但是,我想輸出是:

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

我怎麼能匹配字符串之間的任何內容,包括換行符?

注意:我需要使用<tagtag>作爲字符串,因爲其他文件可以在行之間包含多個標記和文本。將更新示例數據以表明這一點。

回答

1

這是用</tag>作爲記錄分隔gnu-awk容易做起來難:

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

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

需要使用''來獲得它們。更新樣本數據。對不起: -/ – DomainsFeatured

+0

ok試試這個:'awk -v RS ='''RT {gsub(/.*? | \ n /,「」);打印「」$ 0 RT}'文件' – anubhava

+1

嘿Anbhava,這個作品!我要提出另一個問題來建立這個問題。謝謝你:-) – DomainsFeatured

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文本專門的工具可以相當脆弱

+0

嘿,約翰,對不起,該數據確實有其他標籤。我的例子太簡約了。我已經更新了一下。 – DomainsFeatured

+0

@DomainsFeatured查看處理修訂的輸入文件的代碼的更新答案。 – John1024

相關問題