如何替换特定格式的由数字和字母组成的多长度单词中的某些字母?

如何替换特定格式的由数字和字母组成的多长度单词中的某些字母?

我有一个文件,我想更改其中所有具有以下格式的代码:n{,3}L{,2}n{,5} where n= [0-9] any number and L [a-zA-Z] any letter either capital or not

我想将 A 或 a 更改为 AB,将 d 或 D 更改为 DK,如下所示:

 Annnnn--> ABnnnnn ; Dnnn-->DKnnn 

该文件看起来像:

$ cat filename
123a67,64,xx
A67990,12,ttt
89d7,34,ggg
234AB445,78,ooo
145aB7699,67,rrr
278Dk89,25,ppp

我尝试了以下 sed 脚本

sed 's/[aA]/AB/g;s/[dD]/DK/g' filename

它适用于只有 A 或 D 的实例,但对于已经是 AB 或 DK 的实例,它将字母加起来为AB--> ABB or DK-->DKK。任何帮助和解释表示赞赏。谢谢!

答案1

至于您的脚本有什么问题,您正在将Aor替换aABand Dor dwith DK,因此任何预先存在的BorK不会受到影响;sed没有在寻找它。您可以放置​​一个可选[bB][kK]使用?(零个或一个前面的字符),使其在出现该字符时也替换该字符。

为了确保仅当[aA]or [aA][bB]etc 后跟数字时才会发生替换,您可以将数字添加到模式中,然后使用()和将其添加回替换中\1

sed -r 's/ab?([0-9])/AB\1/Ig;s/dk?([0-9])/DK\1/Ig' filename

我习惯-r使用 ERE (因此不需要 escape ?)和I不区分大小写的搜索,而不是使用字符类。

相关内容