2013-04-30 74 views
0

我需要使用Unix並創建一個awk腳本。腳本的第一部分是在一個文本文件中找到「Ant」「Ass」和「Ape」,並用大寫的單詞替換它們。查找特定的單詞並用大寫替換

我是否使用gsub查找每個事件?如果我這樣做:

{gsub(/Ass/, "ASS"); print} 
{gsub(/Ape/, "APE"); print} 
{gsub(/Ant/, 'ANT"); print} 

它只是打印每行的文件的3〜4倍...我怎麼能查找和替換這三個字,然後打印出來只修改行?


該方案的第二部分是追蹤到屁股,猿,或Ant和由取代的匹配數目的行數。

感謝您的幫助!

+0

看TOUPPER() – hari 2013-04-30 00:25:47

回答

0

是否所有的替代單一子句中:

{subs += gsub(/Ass/, "ASS"); subs += gsub(/Ape/, "APE"); subs += gsub(/Ant/, "ANT"); print; } 
END { print "Total substitutions:", subs; } 
+0

謝謝!這樣可行!!但現在我的代碼打印原始行以及更改的行...(查看此屏幕截圖:http://jcsites.juniata.edu/students/caulehe11/Capture.png) 此外,感謝您的計數潛艇!你知道我如何跟蹤那些帶有這些單詞的行數嗎? – user2330672 2013-04-30 00:39:07

+0

它不會爲我打印原始行。你是否交互式輸入輸入?你看到你的輸入與輸出混合在一起。 – Barmar 2013-04-30 00:42:07

+0

如果您想知道是否對該行進行了任何更改,請使用新變量來保存'gsub'的結果,並在所有替換之後檢查它是否大於0。然後,您可以增加一個'lines_changed'變量,並將這個每行總數加到'subs'中以獲得運行總數。 – Barmar 2013-04-30 00:44:25

0

另一種方式:

awk ' 
    BEGIN {IGNORECASE=1} 
    { 
     s = 0 
     while (match(substr($0, s),/ass|ape|ant/) > 0) { 
      c=substr($0,s + RSTART - 1,RLENGTH) 
      sub(c,toupper(c)) 
      s += RSTART + RLENGTH 
     } 
    print 
    }' input 
相關問題