这主要是出于好奇,我试图具有与以下相同的行为:
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)
以下是一些替代方案,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其中包含的记录。