使用sed命令从特定行和特定位置替换一组值

时间:2018-11-27 13:27:36

标签: bash shell sed replace

我有一个文本文件

    -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

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

因此,如果有人可以通过某种方式帮助我,那将真是太好了 我可以替换只有非空间的一组位置 或在每次替换时,将以下值集或行的其余部分替换为前面的空格。或其他可以指向该值并替换它的方法。

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

2 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,那么您正在寻找的是这个问题:

 $ 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是行号。

答案 1 :(得分:1)

仅使用printf,例如:

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

对于您而言,这意味着将$variable替换为$(printf '%7s' $variable)