我正在搜索
的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上提供的内容(因此最新功能可能不存在)
答案 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`