【问题标题】:How does gawk -e 'BEGIN {' -e 'print "hello" }' work?gawk -e 'BEGIN {' -e 'print "hello" }' 是如何工作的?
【发布时间】:2019-04-16 20:44:18
【问题描述】:

Gawk 5.0.0 于 2019 年 4 月 12 日发布。通过the announcement 我发现了这个:

从 4.2.1 更改为 5.0.0

(...) 11. 命名空间已经实现!请参阅手册。这样做的一个后果是-i 包含的文件、-f 读取的文件和命令行程序段都必须是自包含的句法单元。例如,你不能再做这样的事情:

gawk -e 'BEGIN {' -e 'print "hello" }'

我对这种不再受支持的行为感到好奇,但不幸的是,我的 Gawk 4.1.3 并没有提供太多输出:

$ gawk -e 'BEGIN {' -e 'print "hello" }'
gawk: cmd. line:1: BEGIN {
gawk: cmd. line:1:        ^ unexpected newline or end of string

根据我在 GAWK 4.2 手册中看到的,-e 选项已被标记为有问题:

GNU Awk User's Guide, on Options

-e 程序文本
--source程序文本

在程序文本中提供程序源代码。此选项允许您将文件中的源代码与您在命令行中输入的源代码混合。当您有想要从命令行程序使用的库函数时,这尤其有用(请参阅 AWKPATH 变量)。

请注意,gawk 将每个字符串视为以换行符结尾(即使不是)。这使得构建整个程序更容易。

注意:目前,没有要求每个程序文本都是完整的句法单元。即,以下当前有效:

$ gawk -e 'BEGIN { a = 5 ;' -e 'print a }'
-| 5

但是,这在未来可能会发生变化,因此依赖此功能并不是一个好主意。

但是,这在我的控制台中再次失败:

$ gawk -e 'BEGIN {a=5; ' -e 'print a }'
gawk: cmd. line:1: BEGIN {a=5; 
gawk: cmd. line:1:             ^ unexpected newline or end of string

那么gawk -e 'BEGIN {' -e 'print "hello" }' 在 Gawk

【问题讨论】:

  • 我已经用 4.2.1 对此进行了测试,它按预期工作。由换行符分隔的所有 -e 字符串的简单串联。它不适用于 4.0.2
  • @kvantour 啊,对,然后 Ed 的回答很到位。感谢您使用 Gawk 4.2 进行检查!
  • 我正在挖掘代码以查看可能发生的变化,但我找不到。
  • @kvantour 确实如此。浏览Gawk 4.2.0 announcement 我找不到任何对e 的引用。
  • @kvantour 我找到了docs of Gawk 4.1,我看到--source只有第一段,所以这部分是新的:请注意,gawk 将每个字符串视为以一个结尾换行符(即使没有)。这使得构建整个程序更容易

标签: awk namespaces gnu


【解决方案1】:

它做的正是你所期望的——将各个部分连接起来形成gawk 'BEGIN {print "hello" }',然后执行它。您实际上可以通过pretty-printing it 看到 gawk 是如何组合代码段的:

$ gawk -o- -e 'BEGIN {' -e 'print "hello" }'
BEGIN {
        print "hello"
}

该脚本不适合分段编写和连接,但如果您考虑以下内容:

$ cat usea.awk
{ a++ }

$ echo foo | gawk -e 'BEGIN{a=5}' -f usea.awk -e 'END{print a}'
6

然后您可以看到预期的功能可能有助于将一些命令行代码与存储在文件中的脚本混合以运行:

$ gawk -o- -e 'BEGIN{a=5}' -f usea.awk -e 'END{print a}'
BEGIN {
        a = 5
}

{
        a++
}

END {
        print a
}

【讨论】:

  • 谢谢!有趣的是,这在 Gawk 4.2 上运行良好,但在我使用的 4.1 中却不行。
  • 酷!我不知道 -o / --pretty-print 选项
  • 帮助理解我们看到的许多发布的脚本非常有用,因为我们在这个论坛中获得了一些非常有趣的关于代码布局的想法!
  • 我忍不住发布了一个问题来解释-o 选项存在! Is it possible to pretty print Awk's code?
猜你喜欢
  • 2018-03-02
  • 1970-01-01
  • 2019-03-19
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多