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