使用单个 sed 调用 split 和 grep

Sou*_*hym 6 sed

这主要是出于好奇,我试图具有与以下相同的行为:

echo -e "test1:test2:test3"| sed 's/:/\n/g' | grep 1
Run Code Online (Sandbox Code Playgroud)

在一个sed命令中。

我已经试过了

echo -e "test1:test2:test3"| sed -e "s/:/\n/g" -n "/1/p"
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

sed: can't read /1/p: No such file or directory
Run Code Online (Sandbox Code Playgroud)

关于如何解决这个问题并将不同类型的命令组合到一个sed调用中的任何想法?

当然,与实际用例相比,这过于简化了,我知道我可以通过使用多个调用来绕过,这再次只是出于好奇。

编辑:我对这个sed工具最感兴趣,我已经知道如何使用其他工具,甚至这些工具的组合来做到这一点。
EDIT2:这是一个更现实的脚本,更接近我想要实现的目标:

echo -e "test1:test2:test3"| sed 's/:/\n/g' | grep 1
Run Code Online (Sandbox Code Playgroud)

我想简化的是卷曲线,把它变成这样的:

echo -e "test1:test2:test3"| sed -e "s/:/\n/g" -n "/1/p"
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 2

以下是一些替代方案,awk基于sed

sed -E "s/(.*:)?([^:]*1[^:]*).*/\2/" <<< "test1:test2:test3"
awk -v RS=":" '/1/' <<< "test1:test2:test3"
# or also 
awk 'BEGIN{RS=":"} /1/' <<< "test1:test2:test3"
Run Code Online (Sandbox Code Playgroud)

或者,根据您的逻辑,您需要通过管道传输第二个sed命令:

sed "s/:/\n/g" <<< "test1:test2:test3" | sed -n "/1/p"
Run Code Online (Sandbox Code Playgroud)

请参阅此在线演示。该awk解决方案看起来最干净。

细节

sed解决方案中,(.*:)?([^:]*1[^:]*).*pattern 匹配任何 0+ 个字符和 a 的可选序列,然后将除,:之外的任何 0 个或多个字符捕获到第 2 组中,再次捕获除 之外的 0 个或多个字符,然后仅匹配该行的其余部分。替换仅保留第 2 组内容。:1:

awk解决方案中,记录分隔符设置为:,然后/1/使用正则表达式仅返回1其中包含的记录。