【问题标题】:Find specific words and replace with capitals查找特定单词并用大写字母替换
【发布时间】:2013-04-23 19:24:41
【问题描述】:

我需要使用 Unix 并创建一个 awk 脚本。脚本的第一部分是在文本文件中查找单词“Ant”、“Ass”和“Ape”,并将它们替换为相同但大写的单词。

我是否使用 gsub 来查找每个匹配项?如果我这样做:

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

它只打印文件的每一行 3 或 4 次...如何搜索和替换这三个单词,然后只打印修改后的行?


程序的第二部分是跟踪与 Ass、Ape 或 Ant 匹配的行数以及进行的替换次数。

感谢您的帮助!

【问题讨论】:

    标签: regex unix awk gsub


    【解决方案1】:

    在一个子句中进行所有替换:

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

    【讨论】:

    • 谢谢!这样可行!!但是现在我的代码打印了原始行以及更改后的行...(查看此屏幕截图:jcsites.juniata.edu/students/caulehe11/Capture.png)另外,感谢您的潜艇数量!你知道我如何记录这些单词的行数吗?
    • 它不会为我打印原始行。您是否以交互方式输入输入?您看到您的输入与输出混合在一起。
    • 如果你想知道这行是否有任何改变,使用一个新变量来保存gsub的结果,并检查所有替换后是否大于0。然后你可以增加一个lines_changed 变量,并将这个每行总计添加到subs 作为运行总计。
    • 我正在使用文本文件并运行 awk 脚本,然后输出到另一个文件。在那个新文件中,有原始行和新行......我的命令前:nawk -f myreplace.awk aesop.txt > aesop2.txt
    • 我刚刚尝试了我的脚本,它运行良好,原件没有打印出来。
    【解决方案2】:
    sed 's/Ant/ANT/g; s/Ass/ASS/g; s/Ape/APE/'
    

    【讨论】:

      【解决方案3】:

      另一种方式:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-06
        • 2021-06-30
        • 2014-11-28
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-11
        相关资源
        最近更新 更多