【问题标题】:Substituting the '*' Character in AWK using 'gsub'使用 'gsub' 替换 AWK 中的 '*' 字符
【发布时间】:2011-11-10 09:12:49
【问题描述】:

我正在尝试在 unix shell 脚本中使用 AWK 将文件中一种模式的实例替换为另一种模式并将其输出到新文件。

具体来说,如果文件名是 MYFILE.pc,那么我正在寻找带有 'g_MYFILE'(不带引号)的 '*MYFILE' 实例。为此,我在 AWK 中使用了gsub 函数。

我已经成功地写出了输出文件并根据需要替换了所有实例,但是,脚本也用“g_MYFILE”替换了“MYFILE”的实例(即没有星号)

这是脚本:

awk -v MODNAM=${OUTPUT_FILE%.pc} '
{
    gsub("\*"MODNAM, "g_" MODNAM);      
    print 
}' ${INPUT_FILE} > ${FULL_OUTPUT_FILENAME}

为了澄清脚本执行以下转换:

  • '*MYFILE' --> 'g_MYFILE'
  • 'MYFILE' --> 'g_MYFILE'

我只希望执行第一次转换。有人有什么建议吗?

【问题讨论】:

    标签: shell unix scripting awk gsub


    【解决方案1】:

    您可能需要对* 进行双重转义,因为您使用动态正则表达式而不是正则表达式常量作为gsub 的第一个参数。请参阅section 3.8 of the GAWK manual 了解更多信息。

    awk -v MODNAM=${OUTPUT_FILE%.pc} '
    {
        gsub("\\*"MODNAM, "g_" MODNAM);      
        print 
    }' ${INPUT_FILE} > ${FULL_OUTPUT_FILENAME}
    

    【讨论】:

      【解决方案2】:

      您的代码实际上可以在我的 mawk 1.3.3 和 zsh shell 中运行。这可能是 shell 转义问题 - 您是否尝试将 awk 脚本写入文件并通过 -f 调用它?

      【讨论】:

        【解决方案3】:

        对于简单的替换,根本不需要 awk。试试:

        /home/sirch> file="*a*a*a"
        /home/sirch> echo ${file//\*/g_}
        g_ag_ag_a
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-04-21
          • 2017-05-20
          • 2021-01-29
          • 2013-09-05
          • 2020-05-07
          • 1970-01-01
          • 2011-09-25
          相关资源
          最近更新 更多