可以漂亮地打印Awk的代码吗?

fed*_*qui 7 awk gnu pretty-print

我经常发现自己写的Awk单行代码随着时间的流逝变得越来越复杂。

我知道我总是可以创建一个Awk文件来继续添加用例,但是它肯定不如在命令行上更改文本有用。

为此:有什么方法可以漂亮地打印Awk的代码,从而使我更有意义?

例如,鉴于此:

awk 'flag{ if (/PAT2/){printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS}; /PAT1/{flag=1}' file
Run Code Online (Sandbox Code Playgroud)

如何获得更具可读性的内容?

fed*_*qui 5

埃德·莫顿(Ed Morton)向我展示了 GNU awk -o可以进行漂亮的打印:

GNU Awk用户指南,在选项上

-o [文件]
--pretty-print [=文件]

启用awk程序的漂亮打印。暗示--no-optimize。默认情况下,输出程序是在一个名为awkprof.out(请参阅Profiling)的文件中创建的。可选的file参数使您可以为输出指定其他文件名。不允许有空格之间-o文件,如果文件被提供。

注意:过去,此选项也会执行您的程序。这已不再是这种情况。

因此,此处的关键是将结合使用-o

  • 如果我们希望将输出自动存储​​在“ awkprof.out”中,则不会执行任何操作。
  • - 使输出在stdout中。
  • file将输出存储在名为file的文件中

现场观看:

$ gawk -o- 'BEGIN {print 1} END {print 2}'
BEGIN {
    print 1
}

END {
    print 2
}
Run Code Online (Sandbox Code Playgroud)

要么:

$ gawk -o- 'flag{ if (/PAT2/){printf "%s", buf; flag=0; buf=""} else buf = buf $0 ORS}; /PAT1/{flag=1}' file
flag {
    if (/PAT2/) {
        printf "%s", buf
        flag = 0
        buf = ""
    } else {
        buf = buf $0 ORS
    }
}

/PAT1/ {
    flag = 1
}
Run Code Online (Sandbox Code Playgroud)

  • 通知!但是是否有一个计数器操作可以转换为单行代码呢? (2认同)
  • @JamesBrown`tr'\ n'';'`会破坏以'\\'结尾的行的脚本。因此,谢天谢地,没有:-)。(或更准确地说,这是不平凡的,我们不要尝试发明单缸发电机!) (2认同)
  • **如果您没有GNU awk **,则可以使用C美化工具(例如,https://codebeautify.org/c-formatter-beautifier上有一个在线美化工具,您可以复制/粘贴脚本`BEGIN {print 1 }结束{print 2}`到,它将显示与`gawk -o`相同的输出,以获得合理布局的想法。它不是完美的,但总比没有好。 (2认同)