我有一个文件,我想更改其中所有具有以下格式的代码: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
至于您的脚本有什么问题,您正在将A
or替换a
为AB
and D
or d
with DK
,因此任何预先存在的B
orK
不会受到影响;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
不区分大小写的搜索,而不是使用字符类。