Замена символа «*» в AWK с помощью «gsub»

Я пытаюсь использовать 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}

Для уточнения скрипт выполняет следующее преобразование:

  • '*МОЙ ФАЙЛ' --> 'g_МОЙ ФАЙЛ'
  • 'МОЙ ФАЙЛ' --> 'g_МОЙ ФАЙЛ'

Я хочу, чтобы было выполнено только первое преобразование. У кого-нибудь есть предложения?


person James Wiseman    schedule 10.11.2011    source источник


Ответы (3)


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

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

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

person thiton    schedule 10.11.2011

Для простых подстановок вообще не нужен awk. Пытаться:

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