如果在shell中找到字符串,如何在固定位置覆盖一行?

时间:2018-08-09 19:05:13

标签: bash shell vim

我有一个输入文件,并且如果该文件中的任何行都有特定的关键字,我想覆盖特定列位置的数据(例如,我想用xxxxxx填充第10到15列)。我是Shell脚本的新手。如果我听起来很天真,请原谅。

样本输入:

aaaaa 11 ****** bacxyz more data
bbbbb 11 ****** qweabc more data
ccccc 11 ****** pqrxyz more data
aaaaa 11 ****** jkkxyz more data

预期输出:(如果一行的任何位置有aaaaaa,请用xxxxxx覆盖col 10至15,否则按原样写入。)

aaaaa 11 ****** xxxxxx more data
bbbbb 11 ****** qweabc more data
ccccc 11 ****** pqrxyz more data
aaaaa 11 ****** xxxxxx more data

4 个答案:

答案 0 :(得分:2)

sed可能对您有用:

sed -E '/aaaaa/ s/^(.{16}).{6}(.*)/\1xxxxxx\2/' file

aaaaa 11 ****** xxxxxx more data
bbbbb 11 ****** qweabc more data
ccccc 11 ****** pqrxyz more data
aaaaa 11 ****** xxxxxx more data

在预期输出中它不在10-15位置,而是17-22。

答案 1 :(得分:2)

您可以使用以下Vim命令:

Dialog

这将用:g/aaaaa/s/\%>16c\%<23c./x/g 替换第16列和第23列之间的字符。替换在包含文本x的行中执行。

答案 2 :(得分:1)

使用awk通常很容易获得列数据-“如果第一个字段为aaaaa,则将第四个字段设为xxxxx;然后打印该行,不管它是什么”:

awk '$1=="aaaaa"{$4="xxxxx"}{print}' filename

答案 3 :(得分:0)

另一个全局命令

 :g/^a/norm 3wvt rx