我的目录中有一些文件。我想使用 . 在文件的顶部和末尾添加一些行awk
。
示例:我的awk
命令:
awk 'BEGIN { print "line1\nline2" } { print $0 } END { print "line3\nline4" }' file |tee file
通过使用上面的命令,我可以在顶部 &的末尾添加line1
&line2
line3
line4
file
现在我想对当前目录中存在的所有文件执行相同的操作。
如果我使用:
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 awk
4.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