2014-10-29 36 views
1

我试图从somefile获得前4行,并将它们与someotherfile的内容连接并将其输出到somefile如何连接两个文件并将结果写回其中一个原始文件

head -4 /somefile | cat - /someotherfile > /somefile 

当我做到这一点someotherfile的内容somefile结束了,但不是第4行。如果我输出到一个完全不同的文件,那么它效果很好。

显然有一个问题,试图写入我正在阅读的同一个文件。完成这项任务最简单的方法是什么?

我正在尝试在RedHat Enterprise 6 bash shell上执行此操作。

+2

'head -4/somefile | cat -/someotherfile>/yetanotherfile && mv/yetanotherfile/somefile' – ooga 2014-10-29 22:49:53

回答

0

您可以保存head输出到临时变量,就像这样:

HEAD="$(head -4 some file)" 
(echo "$HEAD"; cat someotherfile) >some file 

或者你可以删除5日开始的所有线条和追加另一个文件末尾的内容:

sed -i '5,$d' somefile 
cat someotherfile >>somefile 
+0

谢谢Slava。我接受了你的第二个建议。 – irrational 2014-10-29 23:09:14

0

这也正是问题:

“显然有与试图写我从阅读同一文件中的问题”

使用另一个文件写入,完成后将其移动到覆盖原文件。或者在写入内容之前先使用某种工具来读取内存中的原始文件,但我不确定bash是否有类似的东西。

0

所以看来你想编辑文件somefile如下:删除它的第四行后的所有内容,并追加文件someotherfile

您可以使用标准编辑器ed

ed -s somefile < <(printf '%s\n' '5,$d' 'r someotherfile' 'wq') &> /dev/null 
  • 5,$d告诉ed删除一切从第五行直到文件的末尾(&>/dev/null是在这里看不到任何的ed投诉的情况下,该文件somefile具有小于4行) 。
  • r someotherfile将插入文件someotherfile
  • wq是如何评价kthxbye(并保存)ed
+0

由于某种原因,这没有奏效。没有错误,但在运行后,“somefile”仍然与以前一样。我确实喜欢这是一个单线解决方案。 – irrational 2014-10-29 23:11:27

+0

@irrational:对不起,它没有工作。可能是因为关于RH的'ed'工作的细节。手工尝试:'ed somefile'。然后,从'ed'内尝试命令:'5,$ d','r someotherfile'和'wq',看看'ed'抱怨的地方。也许最后一个'wq'应该是'w'然后'q'。从你这样的经历中,你会看到如何适应我给你的案例。 – 2014-10-29 23:26:27

相关问题