我想用 echo "123|456|789" | sed 's/^\(.*|\)\(.*|\).*$/\1'
我正在尝试断开字符串并获取各个值(没有管道 |)。
- 场景一:我想要得到
123
- 场景2:我想要得到
456
- 场景3:我想要得到
789
- 场景4:我想要得到
123 456 789
答案1
由于我不确定您想要做什么,因此我的回答仅限于修复命令。它应该是:
回声“123|456|789”| sed 的/^(.|)(.|).*$/\1/'
(请注意最后一个引号字符之前的 /)。
然后给出输出:
123|
这就是你想要的吗?
答案2
echo '123|456|789' | sed 's/|.*//'
echo '123|456|789' | sed 's/^[0-9]*|//;s/|.*//'
echo '123|456|789' | sed 's/.*|//'
echo '123|456|789' | sed 's/|/ /g'
或者如果你不珍惜使用sed
echo '123|456|789' | cut -f1 -d\|
echo '123|456|789' | cut -f2 -d\|
echo '123|456|789' | cut -f3 -d\|
echo '123|456|789' | cut -f1,2,3 --output-delimiter=" " -d\|
答案3
我之前的回答只是修复了一个错误。这是我实际解决它的方法:
场景4是最复杂的,所以解决方案如下:
echo '123|456|789' | sed 's/\([0-9]*\)|\([0-9]*\)|\([0-9]*\)/\1 \2 \3/'
最后的 \1、\2 和 \3 选择“装饰括号”( \( 和 \) )之间匹配的部分。每组都由下一个数字引用,因此 \1 代表第一个,依此类推。
对于场景 1、2 和 3,您可以简化它,但是剪切和粘贴会更容易,然后根据需要在最后一组 // 之间添加 \1、\2 或 \3。将其余的装饰括号留在其中不会有什么坏处。
这个解决方案可以扩展到任意数量的字段,尽管如果可能的话我可能更愿意使用 cut。
答案4
使用 GNU sed,您可以通过在 shell var 中提及字段编号来捕获字段$n
n=2; # to get field number 2
echo "123|456|789" | sed -n "s/|/\n/$n;s/^[^\n]*|//;P"
而对于场景 4 来说是:
echo ... | sed -e 'y/|/ /'