shell命令中“sed”的说明

时间:2015-05-29 18:59:30

标签: sed

我使用以下命令从多个文件中提取第一个“结果”并将其写入文件。

for file in *.xml; do cat $file | grep result | sed -n 2p | sed s:"<result>":"": | sed s:"</result>":"": >> tmp.txt; done

我在2年后看着它,我不记得我是如何在第一个“结果”(0.018300606384717713)中从其中2个(第二个是-0.083118623723832552)从文件看起来像这样的数字:< / p>

<?xml version="1.0" encoding="UTF-8"?>
<fit_results>
  <input_file>/Users/hunululu/Desktop/current/m203/ratios/tmp.xml</input_file>
  <time>Fri Oct 17 17:45:51 2014</time>
  <fit_converged>true</fit_converged>
  <iterations>3</iterations>
  <dof>1</dof>
  <chi_sqr_per_dof>0.088802954844880599</chi_sqr_per_dof>
  <Q>0.76570450204332174</Q>
  <parameter_values>
    <parameter>
      <name>a</name>
      <result>0.018300606384717713</result>
      <error>0.0090474462765945517</error>
    </parameter>
    <parameter>
      <name>b</name>
      <result>-0.083118623723832552</result>
      <error>0.045747262135131625</error>
    </parameter>
  </parameter_values>
</fit_results>

任何人都可以帮助我理解它是如何拿起第一个而不是第二个结果吗?感谢。

2 个答案:

答案 0 :(得分:2)

更基本的问题是,无论何时在shell中编写循环只是为了操作文本,你都会采用错误的方法。您的整个命令行可以简化为:

awk -F'[<>]' 'FNR==1{cnt=0} /result/&&(++cnt==2){print $3}' *.xml > tmp.txt

答案 1 :(得分:1)

这里的关键是2pp代表打印当前模式空间。但如果您在前面添加一些数字i,则意味着在模式空间中打印i'th行。

在您的情况下,grep之后的模式空间是:

<fit_results>
      <result>0.018300606384717713</result>
      <result>-0.083118623723832552</result>
</fit_results>

因此,2p选择了第二行,因此得到了第一个结果。