使用 awk 和 find 进行多文件重定向

使用 awk 和 find 进行多文件重定向

我的目录中有一些文件。我想使用 . 在文件的顶部和末尾添加一些行awk

示例:我的awk命令:

awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' file |tee file

通过使用上面的命令,我可以在顶部 &的末尾添加line1&line2line3line4file

现在我想对当前目录中存在的所有文件执行相同的操作。

如果我使用:

awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' *

然后我在终端屏幕上得到输出,但我无法重定向到(或覆盖)所有文件

所以,我尝试了以下操作(To find+ awk):

find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' \;

通过使用上面的命令,我可以在屏幕上打印输出,因此覆盖文件,

我尝试过以下操作(To find+ awk+ overwrite with tee),但出现错误:

$ find -type f -exec awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' '{}' | tee '{}' \;
find: missing argument to `-exec'

因此,我该如何使用awk覆盖(即:与|tee或其他东西)对于所有文件通过命令在当前目录中?

答案1

使用 GNU awk4.1 或更高版本:

find . -type f -exec awk '
   @load "inplace"
   BEGINFILE {
     inplace_begin(FILENAME, "")
     print "line1\nline2"
   }
   {print}
   ENDFILE {
     print "line3\nline4"
     inplace_end(FILENAME, "")
   }' {} +

答案2

决定1: 使用 GNUsed代替awk

sed -i -e '1 i\line1\nline2' -e '$ a\line3\nline4' ./* 

决定2:对目录中的每个文件使用循环

for file in ./*
do
  awk '
       BEGIN { print "line1\nline2" }
       { print $0 }
       END { print "line3\nline4" }
      ' "$file" > "$file".tmp &&
    mv -f "$file".tmp "$file"
done

相关内容