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

Bash 如果在shell中找到字符串,如何覆盖固定位置的行?,bash,shell,vim,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 预期输出:如果一行在任何位置有AAAAA

我有一个输入文件,如果该文件中的任何一行有一个特定的关键字,我想覆盖特定列位置的数据,比如说我想用xxxxxx填充第10到15列。我不熟悉shell脚本。如果我听起来很天真,请原谅

样本输入:

aaaaa 11 ****** bacxyz more data
bbbbb 11 ****** qweabc more data
ccccc 11 ****** pqrxyz more data
aaaaa 11 ****** jkkxyz more data
预期输出:如果一行在任何位置有AAAAA,则使用xxxxxx else覆盖列10至15,否则按原样写入

aaaaa 11 ****** xxxxxx more data
bbbbb 11 ****** qweabc more data
ccccc 11 ****** pqrxyz more data
aaaaa 11 ****** xxxxxx more data
此sed可能适用于您:

sed -E '/aaaaa/ s/^(.{16}).{6}(.*)/\1xxxxxx\2/' file
顺便说一句,在您的预期输出中不是位置10-15,而是位置17-22。

此sed可能适用于您:

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

顺便说一句,它不是预期输出中的位置10-15,而是17-22。

您可以使用以下Vim命令:

:g/aaaaa/s/\%>16c\%<23c./x/g

这将用x替换第16列和第23列之间的字符。替换在包含文本aaaaa的行中执行。

您可以使用以下Vim命令:

:g/aaaaa/s/\%>16c\%<23c./x/g

这将用x替换第16列和第23列之间的字符。替换在包含文本aaaaa的行中执行。

列数据通常很容易使用awk-如果第一个字段是aaaaa,则将第四个字段设置为xxxxx;然后打印行,无论它是什么:

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

使用awk时,列数据通常很简单-如果第一个字段是aaaaa,则将第四个字段设置为xxxxx;然后打印行,无论它是什么:

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

另一个全局命令

 :g/^a/norm 3wvt rx

另一个全局命令

 :g/^a/norm 3wvt rx

请将示例输入和该示例输入所需的输出添加到您的问题中。如果您喜欢简单的方法,这听起来像是sed或perl可以实现的事情。老实说,我只是在浏览一些有关bash脚本的文档,但是,我找不到任何关于如何对特定列位置执行字符串操作的参考。我知道,看起来我请求您提供免费的代码,但任何指针或这方面的参考都会有所帮助。谢谢。请阅读bash文档,特别是关于子字符串扩展的部分。请注意,您也可以使用sed或awk来实现这一点,这两种工具中的任何一种都可能比纯bash更好、更快。请在您的问题中添加示例输入和该示例输入所需的输出。如果您喜欢简单的方法,这听起来像是sed或perl可以实现的事情。老实说,我只是浏览了一些关于bash脚本的文档,但是我找不到任何关于如何针对特定列位置执行字符串操作的参考。我知道,看起来我请求您提供一些免费的代码来完成我的工作,但是这方面的任何指针或参考都会有所帮助。谢谢。请阅读bash文档,特别是关于子字符串扩展的部分。请注意,您也可以使用sed或awk来实现这一点,这两种工具中的任何一种都可能比纯bash更好、更快。成功了。谢谢请您解释一下这部分“\1xxx\2”好吗?1和2的意义是什么?\1和\2是捕获组1.{16}和2.*的反向引用。是的。成功了。谢谢请您解释一下这部分“\1xxx\2”好吗?1和2的意义是什么?\1和\2是捕获组1的反向引用。{16}和2.*.g调用全局命令,^行开头的字母a。正常模式。3w跳转三个单词vt视觉选择直到下一个空格。rx将选择替换为x。很抱歉,我的键盘不允许我使用反勾号来正确格式化输出。g调用全局命令,^行首字母a。正常模式。3w跳转三个单词vt视觉选择直到下一个空格。rx将选择替换为x。抱歉,我的键盘不允许我使用反勾号来正确格式化输出。