使用 AWK 在單獨的行上替換給定數量的匹配項之後的行

使用 AWK 在單獨的行上替換給定數量的匹配項之後的行

目前,我正在使用 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太低,如果找到匹配的字串,您仍然需要增加該值。

因此,這兩個{}區塊具有不同的條件。

相關內容