Bash 如何使用sed仅选择最后一个匹配?

Bash 如何使用sed仅选择最后一个匹配?,bash,sed,grep,find,match,Bash,Sed,Grep,Find,Match,我想提取这个张量的对角数: *********** Symmetrised Stress Tensor *********** * * * Cartesian components (GPa) * * --------------------------------------------- * * x y

我想提取这个张量的对角数:

 *********** Symmetrised Stress Tensor ***********
 *                                               *
 *          Cartesian components (GPa)           *
 * --------------------------------------------- *
 *             x             y             z     *
 *                                               *
 *  x      3.832865      0.000000      0.000000  *
 *  y      0.000000      3.832865      0.000000  *
 *  z      0.000000      0.000000      3.922869  *
 *                                               *
 *  Pressure:   -3.8629                          *
 *                                               *
 *************************************************
为此,我尝试了以下方法

sed -n 's/.*\* *x *\([0-9.-]*\).*/\1/p' file1 >> x_component.txt
然而,由于有几个这样的张量,这给了我文件1中所有可能的匹配。我只想要最后一个匹配,最后一个张量的x分量

期望输出为:

3.832865 
在文件x-component.txt中

3.832865

在文件y-component.txt等中,是否需要使用sed

awk '$1 == "*" && $2 == "x" {v=$3} END {print v}' input
如果您必须使用sed,则通过管道将其传输到只打印最后一行的第二个实例可能更容易:

< input sed -n '/^\* *x */s///p' | sed -n '$s/ .*//p'

这里有点作弊,做一些简单的假设,使用第二个sed只得到第一列。

这可能对你的GNU sed有用:

sed -E '/^\s*\*\s*x\s*(\S+).*/{s//\1/;h};$!d;x' file

将x值存储在保留空间中,并交换到文件末尾的保留空间。

Williams post的变体。 不要打印最新找到的,而是打印第3位有数字的


这很简单。如果行的第一列和第二列分别匹配*和x,则变量v在第三列中被赋值。输入用尽后,v的值被打印出来。如果我想要倒数第二个匹配,而不是最后一个匹配,我怎么能实现呢?既然问题发生了如此巨大的变化,我建议采用完全不同的方法。一般来说,为了获得倒数第二个示例,快速破解类似于awk’…{a=b;b=$0}END{print a}'Mmm文件非常复杂。这不是一个简单的数据表。所以我不太确定是否一定是这样。我会放更多的文件以提供更好的上下文。问题是这不会打印最后一个匹配。它打印所有张量的所有匹配项。正如我在问题中所解释的,这些张量中有好几个,所以*x有几个匹配项
awk '$1=="*" && $2=="x" && $3~/[[:digit:]]/ {print $3}' file
3.832865