我遇到问题,找不到以下问题的解决方案: 我的文本文件的顶部看起来像这样
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找不到正确的列。 我该怎么办?我想使用脚本为许多文件执行此操作。 非常感谢你的帮助!
答案 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