Awk 使用-i in place选项将字符串打印到标准输出

Awk 使用-i in place选项将字符串打印到标准输出,awk,Awk,我想运行一个GNU AWK脚本,该脚本正在原地编辑文件(例如,使用-I inplace选项),并让它将正在处理的文件名打印到标准输出。有办法做到这一点吗?以下仅将文件名添加为修改文件的第一行,而不是在命令行上打印文件名: BEGINFILE { print FILENAME } 这里有一个解决办法;从命令行中将-i放入(但不是强制性的,请参见-e/-f),并将以下内容放在脚本的最开始处。在开始处理文件内容之前,这将暂时禁用inplace,并打印FILENAME。然后,inplace的BEG

我想运行一个GNU AWK脚本,该脚本正在原地编辑文件(例如,使用
-I inplace
选项),并让它将正在处理的文件名打印到标准输出。有办法做到这一点吗?以下仅将文件名添加为修改文件的第一行,而不是在命令行上打印文件名:

BEGINFILE {
  print FILENAME
}

这里有一个解决办法;从命令行中将
-i放入
(但不是强制性的,请参见
-e
/
-f
),并将以下内容放在脚本的最开始处。在开始处理文件内容之前,这将暂时禁用
inplace
,并打印
FILENAME
。然后,
inplace
BEGINFILE
规则将再次启用

BEGINFILE {
    if (inplace::filename != "") {
        inplace::end(inplace::filename, inplace::suffix)
        inplace::filename = ""
    }
    print FILENAME
}

@include "inplace"

请参阅以获得更好的理解。

这里有一个解决方法;从命令行中将
-i放入
(但不是强制性的,请参见
-e
/
-f
),并将以下内容放在脚本的最开始处。在开始处理文件内容之前,这将暂时禁用
inplace
,并打印
FILENAME
。然后,
inplace
BEGINFILE
规则将再次启用

BEGINFILE {
    if (inplace::filename != "") {
        inplace::end(inplace::filename, inplace::suffix)
        inplace::filename = ""
    }
    print FILENAME
}

@include "inplace"


<> p> >为了更好地理解.< /p>为什么要将这样的跟踪信息打印到STDUT而不是STDRR?<代码>初学者文件{打印文件名>“/DEV/STDER”} /代码> @ EdMorton,我没有考虑打印到<代码> STDRR ,而不是<代码> STDUT/<代码>,这似乎是一个很好的解决方案。谢谢你对这个问题的另一个答案的评论@EdMorton这是你的主意,请随意添加此作为答案。kvantour Id不是@oguzismail提供了问题的答案,我不想分散我的注意力。为什么要将跟踪信息打印到stdout而不是stderr?
BEGINFILE{print FILENAME>“/dev/stderr”}< EdMorton >我没有考虑打印到<代码> STDRR 而不是<代码> StdOut,这似乎是一个很好的解决方案。谢谢你对这个问题的另一个答案的评论@EdMorton这是你的主意,请随意添加此作为答案。kvantour Id不是@oguzismail提供了问题的答案,我不想分散我的注意力。很好,但我会选择
awk-I inplace'BEGINFILE{inplace::end(inplace::filename,inplace::suffix);print filename;inplace::begin(inplace::filename,inplace::suffix)}“
@oguzismail可读性。埃德·莫顿的例子在不了解内部结构的情况下是可以理解的。你的陈述看起来有点神秘。@kvantour我说的不是美学。请参阅我添加到我的评论中的链接处的
inplace::begin
,这是一个品味问题。让你的评论放在这里,供未来的观众参考。”,或将其添加到答案中。请修改您的编辑,相反,我非常不喜欢在命令行中指定要清晰的库-我可以使用
include“inplace”
,并且绝对建议您将其用于任何要保存和重复使用的脚本(但是,
-i inplace
对于一次性脚本或作为shell脚本一部分的小awk脚本来说是绝对合适的),我只希望所有的“include”都位于脚本的顶部,而不必小心地将它们放在脚本中。很好,但是我会选择
awk-i inplace'BEGINFILE{inplace::end(inplace::filename,inplace::suffix);打印文件名;输入::开始(输入::文件名,输入::后缀)}“
@oguzismail可读性。埃德·莫顿的例子在不了解内部结构的情况下是可以理解的。你的陈述看起来有点神秘。@kvantour我说的不是美学。请参阅我添加到我的评论中的链接处的
inplace::begin
,这是一个品味问题。让你的评论放在这里,供未来的观众参考。”,或将其添加到答案中。请修改您的编辑,相反,我非常不喜欢在命令行中指定要清晰的库-我可以使用
include“inplace”
,并且绝对建议您将其用于任何要保存和重复使用的脚本(但是,
-i inplace
对于一次性脚本或作为shell脚本的一部分的小awk脚本来说是绝对合适的),我只希望所有的“include”都位于脚本的顶部,而不必小心地将它们放在脚本中。