将每行中14个字符长度的数字替换为新数字

时间:2015-01-19 17:08:05

标签: shell unix

我有一个每行45个字符的文件 例如:

  

123456789123456789123456789123456789123456789

我需要在每行的第10到第15个字符之间剪切数字,并将其与1000相加。现在我需要将结果放在相同的字符长度(比如10到15之间)。

如果 12345 是一行中第10到第15个字符之间的5个数字,我需要为其添加1000,因此该值将为 13345
所以我需要在同一个位置替换ans。

最终结果:

  

123456789133456789123456789

请使用unix建议。

1 个答案:

答案 0 :(得分:3)

这是使用Shell Parameter Expansion完成此任务的方法:

while read line; do
    echo "${line:0:9}$((${line:9:5} + 1000))${line:14}"
done < file

它只需要线的相关部分并处理它们。它使用子串扩展:

  

$ {参数:偏移}
  $ {参数:偏移量:长度}
      从offset指定的字符开始扩展为参数的最大长度字符。如果省略length,则展开从offset指定的字符开始的参数的子字符串。 length和offset是算术表达式(参见Shell Arithmetic)。这称为子字符串扩展。


扩展到新要求

引用:

  

我需要从每行的第16个字符到第20个字符获取字符值。我需要为该数字添加10000,并将结果放在同一行的两个位置,1。从第16到第20个字符。 2.从第6到第10个字符。

     

例如:

     

i / p 1111122222333334444455555

     

o / p 1111154444333345444455555。

     

过程:第16至第20个字符:44444

     

添加10000:54444(结果)

     

(必须将此结果放在如上所述的2个位置)。

     

行中的其余值应该是原样。

while read line; do
    A1=${line:0:5}
    #A2=${line:5:5}
    A3=${line:10:5}
    A4=${line:15:5}
    A5=${line:20}
    result=$((A4+10000))
    echo "$A1$result$A3$result$A5"
done < file

解释

它只是从行中保存子串,然后相应地处理它们:

1111122222333334444455555
<---><---><---><---><--->
 A1   A2   A3   A4   A5

请注意,您不需要$A2,所以,我刚评论过它 我希望它现在有所帮助。