使用'gsub'替换AWK中的'*'字符

时间:2011-11-10 09:12:49

标签: shell unix scripting awk gsub

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

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

我已成功写出输出文件并根据需要更换了所有实例,但是,该脚本还将'MYFILE'(即没有星号)的实例替换为'g_MYFILE'

这是脚本:

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

澄清脚本执行以下转换:

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

我只想要进行第一次转换。有没有人有任何建议?

3 个答案:

答案 0 :(得分:2)

您可能需要双倍转义*,因为您使用动态正则表达式而不是正则表达式常量作为gsub的第一个参数。有关详细信息,请参阅section 3.8 of the GAWK manual

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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