【问题标题】:How do I concatenate two files and write the result back to one of the original files如何连接两个文件并将结果写回原始文件之一
【发布时间】:2014-10-29 22:44:46
【问题描述】:

我正在尝试从somefile 获取前4 行,将它们与someotherfile 的内容连接起来并输出到somefile

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

当我这样做时,someotherfile 的内容以 somefile 结尾,但不是前 4 行。如果我输出到一个完全不同的文件,那么效果很好。

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

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

【问题讨论】:

  • head -4 /somefile | cat - /someotherfile > /yetanotherfile && mv /yetanotherfile /somefile

标签: linux bash pipe cat head


【解决方案1】:

您可以将head 的输出保存到临时变量中,如下所示:

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

或者您可以删除从第 5 行开始的所有行并将另一个文件的内容附加到末尾:

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

【讨论】:

  • 谢谢斯拉瓦。我同意了你的第二个建议。
【解决方案2】:

这正是问题所在:

“很明显,尝试写入我正在读取的同一个文件时存在问题。”

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

【讨论】:

    【解决方案3】:

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

    您可以使用标准编辑器ed

    ed -s somefile < <(printf '%s\n' '5,$d' 'r someotherfile' 'wq') &> /dev/null
    
    • 5,$d 告诉 ed 删除从第五行到文件末尾的所有内容(&amp;&gt;/dev/null 在这里看不到 ed 的任何投诉,以防文件 somefile 少于 4 行)。
    • r someotherfile 将插入文件someotherfile
    • wq 是您对edkthxbye(并保存)的方式。

    【讨论】:

    • 由于某种原因这不起作用。没有错误,但是在我运行它之后,“somefile”仍然和以前一样。我确实喜欢这是一个单行解决方案。
    • @irrational:对不起,它没用。可能是因为 RH 的 ed 工作方式的一些细节。手动尝试:ed somefile。然后,从ed 中尝试以下命令:5,$dr someotherfilewq,看看ed 抱怨的地方。也许最后一个wq 应该是w,然后是q。根据您这样的经验,您将了解如何根据您的情况调整我给出的路线。
    猜你喜欢
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多