2014-06-30 47 views
1

我想從大文件中提取文本,但是我只對兩種模式之間的文本感興趣。使用命令行在兩種模式中選擇文本

樣品文字是這樣的:

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

我的期望輸出應該是名稱標籤內的文本,沒有之前並沒有什麼後。在例如:

輸出:查爾斯

在這種情況下,啓動模式是<name>和末端圖形</name>

我怎樣才能做到這一點用grep/SED/AWK?

+0

'sed的-n「s/^ * \ <\/name> * $/\ 1/p'' – alvits

+0

我獲得以下響應(*):用sed:-e表達式#1,燒焦46:無與倫比(或\( – CjRobin

+0

)第二paren不會逃脫。 – Instantsoup

回答

2

使用GNU AWK多焦RS:

$ awk -v RS='</?name>' '!(NR%2)' file 
Charles 

以上將工作是否或者你的輸入文件中沒有任何地方有換行符,無論多少次<name>...</name>出現在同一行或拆分爲多行,它只需要<name></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 

,如果你想要去除任何前導/從名稱結尾的空白它是一個簡單的調整:

$ awk -v RS='[[:space:]]*</?name>[[:space:]]*' '!(NR%2)' file 
Charles 
William 
Edward 
John Boy Walton 
1

使用awk

awk -F"<|>" '/name/ {print $3}' file 
Charles 

如果所有數據都在一行上做:

awk -v RS="<" -F\> '/name/{print $2;exit}' file 
Charles 
+0

文本全部在一行中,不會被換行符隔開。你認爲這會改變你的解決方案的行爲嗎?我沒有得到任何迴應使用該命令 – CjRobin

+0

@ user3120518看到我更新的職位。我也編輯了你原來的帖子。 – Jotne