匹配模式可能超过换行和仅打印模式

时间:2016-04-18 15:26:40

标签: awk sed grep

我正在搜索

的sphinx .rst文本文件
:variablerolename:`text may span newline`

可以有多个不同的:variablerolename:件从一行开始。

所以,作为输入示例,我有:

yada :role2:`texty text` yada :role:`text
line` yada filler
yada yada :role:`text of role` yada yada :role2:`start of text
rest of text`
more text :rolename:`Text after this role`
filler :otherrole:`This role 
text` filler

搜索我gotten的答案

grep -P '(?s):[a-z].*:`.*`' filename

但我不认为这是正确匹配多个:角色:一行上的块,因为我得到的一行输出是

yada yada :role:`text of role` yada yada :role2:`start of text

但是,关闭后引用的role2文本的其余部分不会打印在下一行。

我想要的输出只是角色名称和后引用文本,每个实例单独在一行,没有前后文本。所以,像:

:role2:`texty text`
:role:`text line`
:role:`text of role`
:role2:`start of text rest of text`
:rolename:`Text after this role`
:otherrole:`This role text`

我会将此输出传递给|sort|uniq,因此需要单行。

我只能使用RHEL 6.7上提供的内容(因此最新功能可能不存在)

  • GNU bash,版本4.1.2
  • GNU Awk 3.1.7
  • grep(GNU grep)2.20
  • GNU sed版本4.2.1

1 个答案:

答案 0 :(得分:1)

您的问题并不清楚,但这可能是您需要的(使用GNU awk进行多字符RS和RT):

awk -v RS=':[^:]+:`[^`]+`' 'RT{print RT}' file

e.g:

$ cat file
yada yada :role:`text of role` yada yada :role2:`start of text
end of text` yada yada

$ awk -v RS=':[^:]+:`[^`]+`' 'RT{print RT}' file
:role:`text of role`
:role2:`start of text
end of text`

用空白字符替换任何换行符只是:

$ awk -v RS=':[^:]+:`[^`]+`' 'RT{gsub(/\n/," ",RT); print RT}' file
:role:`text of role`
:role2:`start of text end of text`

仅输出唯一值:

$ awk -v RS=':[^:]+:`[^`]+`' 'RT{gsub(/\n/," ",RT); if (!seen[RT]++) print RT}' file
:role:`text of role`
:role2:`start of text end of text`