我知道将输出附加到文件的以下选项:
test.py:
print "Error"
print "Warning"
的test.txt:
Levels:
Debug
当我这样做时:
python test.py > test.txt
它附加在文件的末尾。
但是,如果我想在文件的开头追加,那么我的文件输出如下所示:
Levels:
Error
Warning
Debug
有没有直接的方法可以在不手动创建临时文件的情况下执行此操作(例如,sed -i就可以了)。
我尝试了几种sed方法:
sed -i '1i\`python test.py`' test.txt
但似乎没有工作。
答案 0 :(得分:1)
一种简单的方法是使用单独的临时文件:
python test.py | cat - test.txt > tmp && mv tmp test.txt
-
表示cat
使用标准输入。
我刚刚意识到你确实想把文字放在第一行之后,而不是在开头。为此,您可以使用awk:
python test.py | awk 'NR==FNR{a[++n]=$0;next}1;/Levels:/{for(i=1;i<=n;++i)print a[i]}' - test.txt
NR
是整体记录(行)编号,FNR
是当前输入的记录编号。 NR==FNR
表示第一个块仅对第一个输入进行操作(在本例中是python脚本的输出)。输出将添加到缓冲区a
。 next
表示awk跳过其余命令并转到下一行。
1
是一种速记,可以打印文件中的所有行。当包含&#34;级别的行:&#34;找到,缓冲区a
的每一行也被打印出来。
您可以使用与上面相同的技巧将输出写入临时文件,然后覆盖原始文件。
答案 1 :(得分:0)
这应该这样做:
python test.py |
awk '
NR==FNR { a[NR] = $0; next }
{ print (FNR==1 ? a[1] RS : "") $0 }
END { for (i=2;i in a;i++) print a[i] > ARGV[1] }
' test.txt -
上面将第一个文件读入一个数组,然后在打开来自管道的stdin流之前关闭该文件,这样就可以安全地覆盖第一个文件,其中包含来自与之合并的数组的原始内容。来自管道的输入,无论你喜欢什么顺序。
与awk '...' file > file
不同,这是绝对安全的,因为它是awk而不是shell决定何时覆盖文件,它唯一的问题是内存使用和速度如果原始档案很大。