sed在一行中打印多个匹配项

时间:2016-06-22 09:19:57

标签: shell sed

我有一个文件,包括一些字符串和变量,如:

 ${cat.mouse.dog}
 bird://localhost:${xfire.port}/${plfservice.url}
 bird://localhost:${xfire.port}/${spkservice.synch.url}
 bird://localhost:${xfire.port}/${spkservice.asynch.request.url}
 ${soabp.protocol}://${hpc.reward113.host}:${hpc.reward113.port}
${configtool.store.folder}/config/hpctemplates.htb

我想在“{}”之间打印所有字符串。在某些行中有多个这样的字符串,在这种情况下,它们应保持在同一行中。输出应为:

cat.mouse.dog
xfire.port plfservice.url
xfire.port spkservice.synch.url
xfire.port spkservice.asynch.request.url
soabp.protocol hpc.reward113.host hpc.reward113.port
configtool.store.folder

我尝试了以下内容:

sed -n 's/.*{//;s/}.*//p' filename

但它只打印每行的最后一次出现。如何将所有出现的内容保留在原始文件中的同一行?

2 个答案:

答案 0 :(得分:2)

这可能适合你(GNU sed):

sed -n 's/${/\n/g;T;s/[^\n]*\n\([^}]*\)}[^\n]*/\1 /g;s/ $//p' file

用换行符替换所有${,如果有换行符,则继续,因为没有什么可以处理的。如果有换行符,则删除左侧的非换行符和全局下一个}右侧的非换行符。最后删除全局替换的RHS中引入的额外空间。

答案 1 :(得分:1)

如果您不反对awk,可以尝试以下操作:

 awk -v RS='{|}' -v ORS=' ' '/\n/{printf "\n"} (NR+1)%2' file

记录分隔符RS设置为{}。这将所需图案与其余图案分开。

然后,脚本显示2条中的1条记录(NR+1)%2

为了保持对齐符合预期,输出记录分隔符设置为空格ORS=' ',每次遇到换行符时,此语句/\n/{printf "\n"}都会插入一个。