我有一个文件,它有以下几行
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/'