首页 > 解决方案 > 输出匹配模式,同时保留它们存在的行 - bash

问题描述

我遇到了一个似乎无法弄清楚的乏味问题,尽管搜索和尝试了一段时间,但我相信它非常简单。

我有一个文件:

$ cat test.txt
shdh blah blah balg blah 0.44d 0.55d 0.33d
shdh blah blahdf fvalg blah 6.442d 1.515d 1.23d
3858 shdh blah blah balg blah 2.46d 9.35d 0.83d
shdh blah blah balg blah 4.46d
7 hh 4.5 5.34d 5.55d
t y 6.02d
88 2.7d
0.004d
shdh blah blah balg blah 0.96d 1.113d
6 yjryjh 423.99d 0.1d blah blah 0.9d 0.117d

我想匹配所有 *d 值,过滤掉其余的值,同时保留它们所在的行。IE。要像这样返回所需的输出:

0.44d 0.55d 0.33d
6.442d 1.515d 1.23d
2.46d 9.35d 0.83d
4.46d
5.34d 5.55d
6.02d
2.7d
0.004d
0.96d 1.113d
423.99d 0.1d 0.9d 0.117d

我能够匹配模式,但问题是每个值都会在新行上返回,这不是我想要的:

$ cat test.txt | grep -Eo '[0-9]+\.[0-9]+d'
0.44d
0.55d
0.33d
6.442d
1.515d
1.23d
2.46d
9.35d
0.83d
4.46d
5.34d
5.55d
6.02d
2.7d
0.004d
0.96d
1.113d
423.99d
0.1d
0.9d
0.117d

有没有人知道如何完成并返回所需的输出?可能与tr?尽管我假设使用这种方法,每一行都会连接到一行,但又不是所需的输出。

标签: awksedgrep

解决方案


这是一个解决方案sed

sed -E 's/[^[:space:]]*[^d]([[:space:]]|$)//g'

我只是颠倒了您的初始逻辑:我没有显示以 结尾的字段d,而是删除了不显示的字段。


推荐阅读