2013-04-30 73 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 
相关问题