我有以下数据:
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}'
我得到:
<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>\|^--.*'
,但我还需要找到匹配换行符的方法(如此处所示:Match Anything In Between Strings For Linux Grep Command)。
非常感谢任何帮助。
答案 0 :(得分:2)
您可以将之前的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
答案 1 :(得分:0)
$ 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()。