目前,我正在使用 AWK 查找並替換模式前三次出現後的字串部分。字串的格式如下:func(tempID="39849235",count='12');
,檔案中有很多這樣的字串,如下所示:
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
func(tempID="39849235",count='12');
使用這個連結,我找到了一種使用 AWK 查找並替換字串的前三個實例的方法。我將其更改為我需要它執行的操作,我的腳本片段如下:
id=12349876
awk -v id="$id" 'BEGIN {matches=0}
matches < 3 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id"\""); matches++ }
{ print $0 }' filName.py >filName.py.changed
上述程式碼的目標是匹配包含 tempID 的任何行,並將指派給 tempID 的數字替換為名為 的變數中儲存的值$id
。尋找和取代效果很好,但現在我想用不同的編號取代實例 4-9。我嘗試了以下方法,但它仍然只替換了 tempID 的前 5 個實例:
id2=39843237
awk -v id2="$id2" 'BEGIN {matches=4}
matches < 9 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id2"\""); matches++ }
{ print $0 }' filName.py >filName.py.changed
是否有另一種方法可以實現此目的,以便替換該值範圍?它不必與 AWK 一起使用,也可以與 sed 或任何其他 Linux 實用程式一起使用。此外,該解決方案不一定必須在某個點結束,並且允許替換第三行之後的所有實例,但如果有一個解決方案可以做到這一點,那就更好了。
答案1
你的matches=4
和 的matches < 9
意思是「假設已經有 4 場比賽,繼續進行直到總共有 9 場」。這就是前 5 個實例被替換的原因。您需要像以前一樣從 0 開始,然後將下限包含到邏輯中:
id2=39843237
awk -v id2="$id2" 'BEGIN {matches=0}
matches >=3 && matches < 9 && /.*tempID.*/ { sub(/tempID=.[0-9]+./,"tempID=\""id2"\"") }
/.*tempID.*/ { matches++ }
{ print $0 }' filName.py >filName.py.changed
注意,您需要根據 的值進行替換,matches
但每次匹配時都需要增加該值。您的原始程式碼替換了文字並增加了一個區塊中的值。當因為matches
太高而沒有更換時,價值就不再增加,但已經無所謂了。現在你無法擺脫這種簡單的方法了。由於無法更換matches
時太低,如果找到匹配的字串,您仍然需要增加該值。
因此,這兩個{}
區塊具有不同的條件。