用bash替换数字序列

时间:2013-03-09 08:42:43

标签: bash scripting

使用bash脚本。 示例文本文件是:

<Mixture> 1 1.0000
    <Mean> 39
      0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
    <Variance> 39
      1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
  <TransP> 3

现在我想用其他一些matlab变量数组替换零序列。我希望它如下所示

<Mixture> 1 1.0000
    <Mean> 39
      -3.928404e+00 -2.833521e+00 1.418979e+00 -8.560805e+00 -4.987627e+00 -5.422057e+00 -2.148949e+00 -4.035418e+00 1.111476e+00 -4.360466e+00 -2.430894e+00 -3.562756e+00 2.149250e+01 4.148085e-03 3.280356e-01 1.993892e-01 4.226578e-01 3.070029e-01 3.061973e-01 2.200327e-01 2.279716e-01 1.851751e-01 2.630977e-01 2.530313e-01 1.584220e-01 -7.420680e-02 -6.129631e-02 6.845896e-03 1.414505e-02 5.905741e-02 7.828339e-02 6.020883e-02 7.195320e-02 4.838301e-02 4.507983e-02 6.380487e-02 7.884157e-02 6.597416e-02 -1.690722e-02
    <Variance> 39
      1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
  <TransP> 3

2 个答案:

答案 0 :(得分:0)

假设$matlabvar包含您从Matlab收到的数据:

sed "s/ 0\.0\( 0\.0\)*/ $matlabvar/" input.txt > output.txt

这是正则表达式匹配和替换。

  • s/old/new/ - 将old正则表达式匹配的文字替换为new文字
  • 0 - 匹配0
  • \. - 匹配。
  • \(...\) - 对所包含的元素进行分组
  • * - 这匹配前面表达式中的0个或更多个(分组构造)。

因此它匹配一个0.0,后跟任意数量的其他0.0。然后将其替换为$matlabvar

您可以在regular-expressions.info了解有关正则表达式的所有信息。

答案 1 :(得分:0)

      <Mean> 39
          0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
      <Variance> 39
          1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
 <State> 3
  0.000e+0    1.000e+0    0.000e+0    0.000e+0    0.000e+0
  0.000e+0    5.000e-1    5.000e-1    0.000e+0    0.000e+0
  0.000e+0    0.000e+0    5.000e-1    5.000e-1    0.000e+0
  0.000e+0    0.000e+0    0.000e+0    5.000e-1    5.000e-1
  0.000e+0    0.000e+0    0.000e+0    0.000e+0    0.000e+0

这是我的总文本文件 不幸 建议的命令也会替换上面矩阵形式的零,但我不想要这个。另外一个问题是如何用另一个通用序列替换一般序列(我们不知道模式是怎样)。我认为它应该只通过行号来完成,但另一个问题是我们不知道序列有多少行。那有什么办法吗?