使用 SED 从字符串中派生值

使用 SED 从字符串中派生值

我想用 echo "123|456|789" | sed 's/^\(.*|\)\(.*|\).*$/\1'

我正在尝试断开字符串并获取各个值(没有管道 |)。

  • 场景一:我想要得到123
  • 场景2:我想要得到456
  • 场景3:我想要得到789
  • 场景4:我想要得到123 456 789

答案1

由于我不确定您想要做什么,因此我的回答仅限于修复命令。它应该是:

回声“123|456|789”| sed 的/^(.|)(.|).*$/\1/'

(请注意最后一个引号字符之前的 /)。

然后给出输出:

123|

这就是你想要的吗?

答案2

  1. echo '123|456|789' | sed 's/|.*//'
  2. echo '123|456|789' | sed 's/^[0-9]*|//;s/|.*//'
  3. echo '123|456|789' | sed 's/.*|//'
  4. echo '123|456|789' | sed 's/|/ /g'

或者如果你不珍惜使用sed

  1. echo '123|456|789' | cut -f1 -d\|
  2. echo '123|456|789' | cut -f2 -d\|
  3. echo '123|456|789' | cut -f3 -d\|
  4. 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/|/ /'

相关内容