【问题标题】:Using sed command to replace one set of values from a specific line and specific position使用 sed 命令替换特定行和特定位置的一组值
【发布时间】:2019-04-29 06:15:18
【问题描述】:

我有一个像

这样的文本文件
    -7.9     8.5    1235  125478.30   9632
    32656.12   0.0   0.0    2365.12      h
    254    3365    12543     kk       l423

我的目标是用另一个变量替换 2365.12 出现的位置。 这将在循环中发生更多迭代次数。

最初我使用 sed 来替换引用值。但我对这些事件有疑问。之前的同一行中可能存在相同的值。但我想要替换值的这个位置。

因此我使用了以下命令,它将计算要替换的位置。

   sed -i"3s/^\(.\{32\}\)\(.\{7\}\)\(.*\)/1$variable\3" outputdata.txt

现在我的问题是,当在一个循环中替换具有较少位数的值时,以下值会接近。因此在下一个循环期间,位置计数与下一个值混淆。

因此,如果有人可以帮助我解决问题,那就太好了 要么我可以替换只有非空格的位置集 或在每次替换时将以下一组值或行的剩余部分替换为前面的空格。或其他一些我可以指向该值并替换它的方法。

分隔值的空格数可以不同。

【问题讨论】:

    标签: bash shell sed replace


    【解决方案1】:

    如果我正确理解您的问题,您正在寻找的是:

     $ awk -v myvariable='XXXXX'  '{ if( $4 == "2365.12" ) { $4 = myvariable }; print $0}' input.txt
    -7.9     8.5    1235  125478.30   9632
    32656.12 0.0 0.0 XXXXX h
    254    3365    12543     kk       l423
    

    如果有帮助请告诉我。

    此外,如果您希望这发生在特定行中,您可以使用:

    awk -v myvariable='XXXXX'  '{ if( $4 == "2365.12" && NR == 2 ) { $4 = myvariable }; print $0}' input.txt
    

    其中 NR 是行号。

    【讨论】:

    • 我直到现在还没有为此目的使用过 awk。我去看看
    【解决方案2】:

    只需使用printf,例如:

    $ for x in 1 1000; do echo "foo [$(printf '%7s' $x)] bar"; done
    foo [      1] bar
    foo [   1000] bar
    

    在您的情况下,这意味着将 $variable 替换为 $(printf '%7s' $variable)

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 2014-08-19
      • 2019-08-21
      • 1970-01-01
      • 2011-08-12
      相关资源
      最近更新 更多