我有一个文件,包括一些字符串和变量,如:
${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
但它只打印每行的最后一次出现。如何将所有出现的内容保留在原始文件中的同一行?
答案 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"}
都会插入一个。