簡體   English   中英

使用RS和RT匹配Awk命令中的多個字符串

[英]Match Multiple Strings In Awk Command Using RS And RT

我有以下數據:

Example line 0</span>
<tag>Example line 1</tag>
<span>Example line 1.5</span>
--Hello Example line 1.7
<tag>
Example line 2
</tag>
--Hello Example line 2.7
<span>Example line 4</span>

使用此命令awk -v RS='</tag>' 'RT {gsub(/.*?<tag>|\\n/, ""); print "<tag>" $0 RT}' awk -v RS='</tag>' 'RT {gsub(/.*?<tag>|\\n/, ""); print "<tag>" $0 RT}'我得到:

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

但是,我希望輸出為:

<tag>Example line 1</tag>
--Hello Example line 1.7
<tag>Example line 2</tag>
--Hello Example line 2.7

題:

我只想知道如何添加“或”選項以匹配以--Hello開頭的任何行。 在我的代碼中實現的正確方法是什么?

其他選項:

或者,另一種選擇是使用grep -o '<tag.*tag>\\|^--.*'但我還需要找到一種匹配換行符的方法(如此處要求: Linux字符串之間的任何匹配) Grep命令 )。

非常感謝您的幫助。

您可以將之前的awk命令修改為:

awk -v RS='</tag>' '/\n--Hello /{print gensub(/.*\n(--Hello [^\n]*).*/, "\\1", "1")}
       RT{gsub(/.*<tag>|\n/, ""); print "<tag>" $0 RT}' file

<tag>Example line 1</tag>
--Hello Example line 1.7
<tag>Example line 2</tag>
--Hello Example line 2.7
$ cat tst.awk
BEGIN { RS="--Hello[^\\n]+|<\\/tag>" }
RT { print (RT~/^--/ ? "" : gensub(/.*(<tag>)/,"\\1",1)) RT }

$ awk -f tst.awk file
<tag>Example line 1</tag>
--Hello Example line 1.7
<tag>
Example line 2
</tag>
--Hello Example line 2.7

上面的代碼將GNU awk用於多字符RS,RT和gensub()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM