用变量值替换某些行和列

时间:2017-12-13 21:01:29

标签: vim awk

我遇到问题,找不到以下问题的解决方案: 我的文本文件的顶部看起来像这样

XXXXX
XXXXXX XXXXXXX
X
X
X
XX
X
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  XXXXXXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  XXXXXXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  XXXXXXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  XXXXXXE+00

X是随机数。并且这个从第16行开始的模式(由vim显示为第16行)一直持续到文件的结尾(根据vim的第71行)。这些行总是以空格键开头,后跟一个数字,两个数字之间是两个空格键。 我有一个变量v的值,例如v = 1.50 我想用第16行到第71行的所有行的变量v的值替换最后一列的前4个X,这意味着我想在结尾处准确地存在这个文件(行的开头的空格应该保留) :

XXXXX
XXXXXX XXXXXXX
X
X
X
XX
X
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  1.50XXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  1.50XXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  1.50XXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  1.50XXE+00

我尝试了一下awk,但我遇到的问题是它在数字之间增加了空格(比如1.5 0)而且我也无法将它粘贴到正确的列和行中(vim显示“二进制”列)我用awk找不到正确的列。 我该怎么办?我想使用脚本为许多文件执行此操作。 非常感谢你的帮助!

2 个答案:

答案 0 :(得分:3)

此处sed可能是更好的选择

$ var="1.50"; sed -E '8,$s/ ....(\S+)$/ '"$var"'\1/' file

XXXXX
XXXXXX XXXXXXX
X
X
X
XX
X
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00 1.50XXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00 1.50XXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00 1.50XXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00 1.50XXE+00

在您的示例中,替换行从第8行开始。根据您的实际数据进行更改。

您可以将变量的长度作为派生值

$ var="1.50"; len=${#var}; sed -E '8,$s/ .{'$len'}(\S+)$/  '$var'\1/' file

答案 1 :(得分:2)

使用awk简化,清晰,健壮,可移植性,可扩展性等......:

awk -v v='1.50' 'BEGIN{FS=OFS="  "} NR>15{sub(/.{4}/,v,$NF)} 1' file

e.g。使用您发布的示例输入:

$ awk -v v='1.50' 'BEGIN{FS=OFS="  "} NR>7{sub(/.{4}/,v,$NF)} 1' file
XXXXX
XXXXXX XXXXXXX
X
X
X
XX
X
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  1.50XXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  1.50XXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  1.50XXE+00
 XXXXXXE+00  XXXXXXEE+03  XXXXXXE+07  XXXXXXE+00  1.50XXE+00