Подстановка символа '*' в AWK с использованием 'gsub' - PullRequest
1 голос
/ 10 ноября 2011

Я пытаюсь использовать AWK в сценарии оболочки Unix для замены экземпляра одного шаблона в файле другим и вывода его в новый файл.

В частности, если имя файла MYFILE.pc, то я ищу экземпляры '* MYFILE' с 'g_MYFILE' (без кавычек). Для этого я использую функцию gsub в AWK.

Я успешно выписал выходной файл, и все экземпляры были заменены по мере необходимости, однако скрипт также заменяет экземпляры '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 ]

2 голосов
/ 10 ноября 2011

Вам может потребоваться дважды экранировать *, потому что вы используете динамическое регулярное выражение вместо константы регулярного выражения в качестве первого аргумента gsub. См. раздел 3.8 руководства GAWK для получения дополнительной информации.

awk -v MODNAM=${OUTPUT_FILE%.pc} '
{
    gsub("\\*"MODNAM, "g_" MODNAM);      
    print 
}' ${INPUT_FILE} > ${FULL_OUTPUT_FILENAME}
1 голос
/ 10 ноября 2011

Для простых замен вообще нет необходимости в awk.Попробуйте:

/home/sirch> file="*a*a*a"
/home/sirch> echo ${file//\*/g_}
g_ag_ag_a
1 голос
/ 10 ноября 2011

Ваш код фактически работает в моей оболочке mawk 1.3.3 и zsh.Это может быть проблема с выходом из оболочки - вы пытались записать сценарий awk в файл и вызвать его через -f?

...