Я хочу создать скрипт awk
с таким шебангом, чтобы
./main.awk text.txt
выполняет модификацию на месте в text.txt
. Вдохновленный предыдущим решением , я попробовал что-то вроде
#!/usr/bin/awk -i inplace -f
но это не сработало.
@EdMorton суффикс .awk
кажется довольно распространенным. Упомянутое вами обсуждение суффикса .sh
вообще не относится к сценариям AWK. Они предназначены для разных целей.
Суффикс .awk
предназначен для файлов, которые вы запускаете с помощью awk -f foo.awk
или содержат код awk, полученный из других сценариев awk, т. е. являющийся источником для интерпретации команды awk
, а не для команд Unix, которые вы вызываете напрямую, которые просто реализованы в awk. Представьте, что вы создаете команду с именем foo.awk
и через год вы решаете переопределить foo.awk
в Perl или исполняемом файле C - теперь вам нужно найти каждую другую команду, которая вызывает ее, чтобы изменить foo.awk
на foo.perl
или foo.exe
или подобное, что является признаком напряженности. связь, которая делает его плохим программным обеспечением.
То, что что-то общее, не делает это хорошей идеей. Не заключать переменные в кавычки в сценариях оболочки, UUOC и любых других антишаблонах также распространено.
Используйте /usr/bin/env
с опцией -S
для обработки нескольких аргументов:
#!/usr/bin/env -S awk -i inplace -f
См. man env
:
-S, --split-string=S
process and split S into separate arguments; used to pass multiple arguments on shebang lines
Самым простым было бы
#/usr/bin/gawk -f
@include "inplace"
# rest of the code goes here
...
-i
или --include
— это просто сокращение директивы @include
.
Никогда не используйте shebang для вызова awk, см. stackoverflow.com/a/61002754/1745001 , и никогда не присваивайте команде Unix суффикс, например
.awk
, см. stackoverflow.com/a/27824204/1745001.