awk -v выход из строя / не удается открыть файл из-за переменных в поле замены - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь ввести строку, содержащую переменные выше n-го совпадения шаблона, используя awk (на данный момент).Моя настоящая цель - изменить содержимое файла real_printf.c, добавив строки чуть выше 2-го совпадения return (0);, содержащего, например, printf("%s%d%s", str00,int01,str03);.Я создаю генератор случайных printf в качестве добровольного бонуса для школьного проекта (-> перекодирование printf в .c) и уже могу вводить объявление случайных переменных, преобразовывать флаги между % и индикатором преобразования, среди прочего.Это последний шаг, прежде чем я получу рабочий прототип.

У меня уже есть команда awk для совпадения return (0);, но я столкнулся с первой ошибкой, говорящей, что я делю на 0 и, таким образом, заканчиваю выполнение awk.См. Приведенный ниже код:

1) awk '/return/{c++;if(c==2){ print "\t\tprintf("'$input_pf'", '$var_name');"; c=1 }} 1' .annex/real_printf.c

Я исправил эту ошибку, изменив приведенный выше код на приведенный ниже код, прочитав множество онлайн-ресурсов, используяawk -v и объявление переменных:

2) awk -v input="$input_pf" name="$var_name" "/return/{c++;if(c==2){ print "\\t\\tprintf\(\"$input\", $name\);"; c=1 }} 1" .annex/real_printf.c

Для приведенного выше кода оболочка вернула эту ошибку:

awk -v input=%p name=ptr00 '/return/{c++;if(c==2){ print \t\tprintf("",' ')'
awk: can't open file /return/{c++;if(c==2){ print \t\tprintf("",
 source line number 1
+ '; c=1 }} 1' .annex/real_printf.c
.annex/modify/pct_conv.sh: line 34: ; c=1 }} 1: command not found

Поэтому я решил удалить двойные кавычки вокруг переменных после awk -v, см. Код ниже.

3) awk -v input=$input_pf name=$var_name "/return/{c++;if(c==2){ print "\\t\\tprintf\(\"$input\", $name\);"; c=1 }} 1" .annex/real_printf.c

Теперь я получаю следующий результат, и у меня не хватает идей, чтобы попробовать:

awk -v input=%f%o%s name=f00,o01,str02 '/return/{c++;if(c==2){ print \t\tprintf("",' ')'`
`awk: syntax error at source line 1
 context is
     ``>>> name=f00,o01, <<<``
awk: bailing out at source line 1
+ '; c=1 }} 1' .annex/real_printf.c
.annex/modify/pct_conv.sh: line 34: ; c=1 }} 1: command not found

Это должно быть проблемой синтаксиса, или я могу просить слишком много из awk в одной строке.Возможно, awk даже не лучший инструмент для этого.Я попытался с sed -i '' 's/return (0);/printf("$input_pf", $var_name)/2', чтобы перейти ко 2-му совпадению моего паттерна, но это также не сработало бы.

Как бы вы решили эту проблему?

1 Ответ

0 голосов
/ 04 февраля 2019
# assign some values so we can test
input_pf=%f%o%s
var_name=f00,o01,str02

# sample input to exercise the code
input=$(cat <<'EOF'
return
return
return
return
EOF
)

# actual code here
awk -v input="$input_pf" -v name="$var_name" '
/return/ {
  if(count++ > 0) {
    printf "\t\tprintf(\"%s\", %s);\n", input, name
  }
}
1 { print }' <<<"$input"

Примечание:

  • Мы ставим отдельный -v перед каждой парой name=value.Без этого вторая пара name=value обрабатывается как ваш сценарий awk, а аргумент после него обрабатывается как имя входного файла.
  • Мы всегда цитируем расширения оболочки вдвойные кавычки.
  • Мы помещаем код awk в одинарные кавычки, чтобы он не искажался оболочкой.
  • Мы не с использованием $ при обращении к переменным awk (поскольку это только синтаксис оболочки).

С этими изменениями все правильно (насколько я могу судить, без ввода или вывода примера)в вопросе) возвращает:

return
        printf("%f%o%s", f00,o01,str02);
return
        printf("%f%o%s", f00,o01,str02);
return
        printf("%f%o%s", f00,o01,str02);
return
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...