1

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

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

我已经成功地写出了输出文件并根据需要替换了所有实例,但是,脚本也用 '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'

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

4

3 回答 3

2

您可能需要双重转义,*因为您使用动态正则表达式而不是正则表达式常量作为gsub. 有关详细信息,请参阅GAWK 手册的第 3.8 节

awk -v MODNAM=${OUTPUT_FILE%.pc} '
{
    gsub("\\*"MODNAM, "g_" MODNAM);      
    print 
}' ${INPUT_FILE} > ${FULL_OUTPUT_FILENAME}
于 2011-11-10T09:32:04.513 回答
1

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

/home/sirch> file="*a*a*a"
/home/sirch> echo ${file//\*/g_}
g_ag_ag_a
于 2011-11-10T09:29:21.003 回答
1

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

于 2011-11-10T09:19:59.303 回答