Linux

如何替換由特定格式的數字和字母組成的多長度單詞中的一些字母?

  • December 2, 2016

我有一個文件,我想在其中更改所有具有以下格式的程式碼: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。任何幫助表示讚賞解釋。謝謝!

至於您的腳本有什麼問題,您將 or 替換Aaand ABor Dwith dDK因此任何預先存在的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不區分大小寫的搜尋,而不是使用字元類。

引用自:https://unix.stackexchange.com/questions/327429