Sed在条件下替换最后一个字符



我有一个文件,它有以下几行

172XI207    X123955 1
412XE401    XE05689 1
412XI402    XI9515  1
412XI403    XI06702 1
412XE404    XE75348 1

如果第二列中的前两个字符与XE匹配,我希望将最后一列替换为2。

结果应该如下

172XI207    X123955 1
412XE401    XE05689 2
412XI402    XI9515  1
412XI403    XI06702 1
412XE404    XE75348 2

我想用sed(而不是awk)。有人能告诉我如何使用sed实现这一点吗?

许多sed命令都有一个地址或地址范围(有关详细信息,请参阅手册页)。当然,最常见的命令可能是s,但它是采用地址范围的命令之一,这意味着它不需要应用于每一行。地址范围xan必须是正则表达式。s命令为:

{address}s/pattern/replacement/

对您来说,地址匹配RE-是/ XE/(假设您的列是空格分隔的;如果需要,请将其更改为选项卡),模式是1$和替换2。因此:

/ XE/s/1$/2/

或作为命令行

sed -e '/ XE/s/1$/2/' < oldfile > newfile

编辑:哦,第二列,不是行首。

这个命令应该可以完成任务(假设您正在查看myfile.txt

sed -e '/    XE/ s/1$/2//' myfile.txt

您可以通过添加-i选项来确保您的替换已经执行,该选项将在适当的位置修改文件,但请确保它正是您之前所期望的。

编辑:根据评论中的问题,这里有一个在第三列匹配并在第五列替换的命令。

sed -e 's/^((w+W+){2}XE(w+W+){2})1/12/'

或者,作为替代方案,您可以先选择行,然后替换:

sed -e '/^(w+W+){2}XE/ s/^((w+W+){4})1/12/'

最新更新