Sed替换条件中的最后一个字符

Sed替换条件中的最后一个字符,sed,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

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

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来实现这一点吗?

这个命令应该可以做到这一点(如果您正在查看
myfile.txt

您可以通过添加
-i
选项来确保您的替换操作,该选项将修改文件,但请确保它正是您之前所期望的

编辑:根据注释中的问题,这里有一个与第3列匹配并替换第5列的命令

sed -e 's/^\(\(\w\+\W\+\)\{2\}XE\(\w\+\W\+\)\{2\}\)1/\12/'
或者,您也可以先选择行,然后替换:

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

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

{address}s/pattern/replacement/
对于您来说,地址匹配重新是
/XE/
(假设您的列是空格分隔的;如果需要,将其更改为选项卡),模式是
1$
,替换为
2
。因此:

/ XE/s/1$/2/
或者作为命令行

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

编辑:哦,第二列,不是行的开头。

谢谢。此解决方案有效,但可以使用列条件,而不是在行中搜索模式。因为我有另一个文件,它有5列,并希望根据第3列中的模式替换第5列。在某些行中,相同的模式可能会出现在第二列中,但我只想在第三列的前两个字母与给定的模式匹配时更新第五列。我想说,你最好使用awk来完成这项工作,因为它在列的概念上更好,不过你可以使用一些{n}匹配。@sanjanish:我更新了我的答案来回答你的评论。不过你应该把它放在你的问题里。
sed -e '/ XE/s/1$/2/' < oldfile > newfile