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

Shell sed在一行中打印多个匹配项,shell,sed,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.hos

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

 ${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
 awk -v RS='{|}' -v ORS=' ' '/\n/{printf "\n"} (NR+1)%2' file
但它只打印每行的最后一次出现。如何才能获得与原始文件中相同的行中的所有引用?

这可能适用于您(GNU-sed):


将所有
${
替换为换行符,如果有非换行符,则继续,因为没有要处理的内容。如果有换行符,则全局删除下一个
}
左侧的非换行符和右侧的非换行符。要结束此操作,请删除全局替换的RHS中引入的额外空间。

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

sed -n 's/.*{//;s/}.*//p' filename
 awk -v RS='{|}' -v ORS=' ' '/\n/{printf "\n"} (NR+1)%2' file
记录分隔符
RS
设置为
{
}
。这会将想要的图案与其他图案分开

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


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

非常感谢。这正是我所需要的。:-)awk是完美的。我有两天没有找到解决方案,所以我非常感谢。现在我想为同一文件的所有变量运行一个脚本。脚本完成了,它将解析变量以获取它们的值。让我们调用脚本resolve.sh。我想浏览一下文件,如果“{}”之间有一个字符串,让脚本运行。类似于cat文件| for i in
awk-vrs='{|}'-vrs=''/\n/{printf'\n'}(NR+1)%2'
;do resolve.sh$i;当然,我的“解决方案”是错误的,因为它只给出变量的解析值,每一个都是一条单独的线。我希望有原始文件,但如果有变量,让resolve.sh运行。如果我理解得很好,并且您希望循环所有匹配模式,可以使用以下方法:
for I in$(awk-v RS='{}'-v ORS=''(NR+1)%2'test);do resolve.sh$i;完成
是,这是我获得解析值的方式。但是我想得到一个包含原始文件的输出,其中变量被解析值替换。例如,原始文件:bird://localhost:${xfire.port}/${plfservice.url}输出应如下所示:bird://localhost:8043/net-littlecat rbp我如何打印原始文件的内容,并在存在变量的所有匹配模式中循环?你最好创建一个新帖子,因为这与原始问题不同。这也很完美,就像上面的awk解决方案一样。谢谢你们两个。