首页 / 知识
关于Unix:外壳一层衬里以添加到文件中
2023-04-14 20:18:00

Shell one liner to prepend to a file这可能是一个复杂的解决方案。 我正在寻找一个简单的运算符,例如">>",但要放在前面。 恐怕它不存在。 我必须做类似的事情
还有什么更聪明的吗? 这仍然使用一个临时文件,但至少它在一行上:
信用:BASH:在文件前添加文本/行
ed是标准编辑器! http://www.gnu.org/fun/jokes/ed.msg.html 下面的hack是一个快速的即席答案,该方法行之有效并获得了很多好评。然后,随着这个问题变得越来越流行和更多的时间流逝,愤怒的人们开始报告说这确实有效,但是奇怪的事情可能会发生,或者根本就不起作用,因此一度被否决了。好好玩。 该解决方案利用了系统上文件描述符的确切实现,并且由于实现之间的差异很大,因此它的成功完全取决于系统,绝对不可移植,并且即使有任何非常重要的意义也不应依赖于此。 现在,所有的答案都是:
因此,为文件(
将前置变量作为变量传递给awk(
约翰·米(John Mee):您的方法不能保证能正常工作,并且如果您将4096字节以上的内容添加到内容中,可能会失败(至少gnu awk会发生这种情况,但我想其他实现将具有类似的约束)。在这种情况下,它不仅会失败,而且将进入一个无限循环,在循环中它将读取自己的输出,从而使文件增长,直到所有可用空间都被填满。 自己尝试:
(警告:过一会儿杀死它,否则它将填满文件系统) 此外,以这种方式编辑文件非常危险,这是非常糟糕的建议,因为好像在编辑文件时发生了某些情况(崩溃,磁盘已满),几乎可以保证文件处于不一致状态。 没有临时文件是不可能的,但是这里有一个单面纸
您可以使用ed或perl等其他工具来执行此操作,而无需使用临时文件。 可能值得注意的是,使用mktemp之类的实用程序安全地生成临时文件通常是个好主意,至少在脚本将以root特权执行的情况下也是如此。例如,您可以执行以下操作(再次以bash进行):
如果在您控制的计算机上需要此功能,请安装软件包" moreutils"并使用"海绵"。然后,您可以执行以下操作:
使用bash heredoc可以避免需要tmp文件:
之所以有效,是因为在执行带重定向的cat之前,在评估bash脚本时会评估$(cat myfile)。 当您开始尝试使用shell脚本执行变得困难的事情时,强烈建议您尝试使用"适当的"脚本语言(Python / Perl / Ruby / etc)重写脚本
至于在文件前添加一行,则无法通过管道执行此操作,因为当您执行 也许有一种方法可以通过awk或类似的方法来完成,但是如果您必须使用shell脚本,我认为临时文件是迄今为止最简单的(/ only?)方法。 假设您要编辑的文件是my.txt
您要添加的文件是header
确保头文件中有最后一个空白行。
你最终得到
据我所知,这仅适用于" bash"。 编辑:这是坏的。在使用cat和tee前置文件时,请参阅奇怪的行为
解决覆盖问题的方法是使用
像Daniel Velkov建议的那样,使用tee。
主要用于娱乐/空壳高尔夫,但
可以解决问题,并且没有管道或重定向。当然,vi / ex并非真的非交互使用,因此vi会短暂闪烁。 我用的那个。这使您可以按照自己喜欢的方式指定顺序,额外的字符等:
附言:仅当文件包含带反斜杠的文本时,它才起作用,因为它被解释为转义字符 为什么不简单地使用ed命令(正如fluffle在此处建议的那样)? ed将整个文件读入内存并自动执行就地文件编辑! 所以,如果您的文件不是那么大...
另一个变通办法是按照JürgenH?tzel在将sed s / c / d / myFile重定向输出到myFile中的建议使用打开文件句柄。
当然,所有这些都可以放在一行上。 cb0解决方案的一个变体,用于"无临时文件"以添加固定文本:
再次,这依赖于子外壳程序的执行(..),以避免猫拒绝输入和输出相同的文件。
注意:喜欢此解决方案。但是,在我的Mac中,原始文件丢失了(本来应该不会,但是会丢失)。可以通过将解决方案编写为: 这是我发现的:
警告:这需要更多的工作来满足OP的需求。
尽管有@shixilun的疑虑,但应该有一种方法可以使@shixilun的sed方法起作用。将文件读入sed替代字符串时,必须有一个bash命令来转义空格(例如,用' n'替换换行符。Shell命令
由于替换脚本中的原始换行而失败,该脚本需要在换行符之前加上换行符(),并可能在后面加上&,以使shell和sed保持满意,例如这样的答案
对于非全局搜索替换命令,
使用$(command)可以将命令的输出写入变量。
您也可以这样做:
但是在那种情况下,您必须确保在任何地方都没有
您可以使用perl命令行:
其中-i将创建文件的内联替换,并 或者,如果my_header是文件:
/ e将允许替换代码的地方。
如果您有一个大文件(在我的情况下只有几百千字节)并且可以访问python,则这比
实际上,如果您使用BASH编写脚本,则可以发出以下命令:
那实际上是您自己在自己的问题中发布的复杂示例。 快速又脏乱,用python缓冲内存中的所有内容:
恕我直言,无论两个文件
您正在寻找的"真实"解决方案需要摆弄文件系统,因此它在用户空间中不可用,并且将依赖于平台:您要将 但是,您可以使用环路设备或多或少地伪造此内容。例如,参见此SO线程。 我认为这是ed最干净的版本:
作为功??能:
其中" my_file"是在" my_string"之前添加的文件。 变量,ftw?
我最喜欢@fluffle的ed方法。毕竟,任何工具的命令行开关与脚本编辑器命令在这里基本上都是同一件事。没有看到脚本化的编辑器解决方案"整洁度"更小或什么都没有。
这是我在
示例
我正在执行 关于这一点,我发现对于vim-buffs来说,拥有以下内容也是一件好事:
呸!没有人愿意提起TAC。
|
最新内容
相关内容
linux命令添加文件?
linux命令添加文件?,工作,简介,数据,系统,文件,命令,操作,文件名,内容,终端,linux哪些指令可以创建文件终端下键入:touch加文件名,这样就创建了linux文件中剪切命令?
linux文件中剪切命令?,位置,系统,工作,命令,发行,连续,标准,终端,文件,目录,linux怎么粘贴粘贴与复制快捷键 Shift + Ctrl + c:复制。Shift + Clinux存储文件命令?
linux存储文件命令?,系统,地址,工作,命令,软件,电脑,标准,底部,信息,文件,linux系统常用操作命令1、linux常用命令有pwd命令、cd命令、ls命令linux保存命令文件?
linux保存命令文件?,系统,状态,命令,文件,第一,管理,电脑,模式,编辑,终端,linux下vi命令编辑器怎样编辑及保存退出?先按ESC进入Command模式,然删除linux文件命令?
删除linux文件命令?,名称,不了,文件夹,命令,文件,目录,方法,指令,子目录,选项,Linux删除文件的命令?linux 删除文件指令:输入rd盘符名:\文件夹linux文件录入命令?
linux文件录入命令?,系统,命令,网络,标准,时间,密码,名字,管理,文件,文件夹,Linux必学的60个命令-文件处理1、安装和登录命令:login、shutdownlinux命令移除文件夹?
linux命令移除文件夹?,命令,文件夹,通用,不了,数据,名称,档案,系统,文件,目录,删除文件夹中所有文件的linux命令(创建和删除文件和文件夹的lin在linux文件后加命令?
在linux文件后加命令?,系统,工作,命令,工具,电脑,基础,管理,情况,第一,简介,Linux文件相关命令命令一:cat cat命令应该是在Linux中查看文件内容linux命令删除文件夹?
linux命令删除文件夹?,系统,名称,环境,文件夹,不了,命令,文件,数据,档案,目录,删除文件夹命令linuxLinux的文件和目录的删除命令有:rm、rmdir、linux命令看文件编码?
linux命令看文件编码?,状态,系统,文件,工具,名称,数据,命令,格式,汉字,以下,Linux如何使用enca查看文件编码并转换1、在Linux中查看文件编码可linux编辑文件的命令?
linux编辑文件的命令?,系统,地址,工作,状态,命令,电脑,信息,管理,目录,终端,linux系统常用操作命令linux常用命令有pwd命令、cd命令、ls命令、linux命令行关掉文件?
linux命令行关掉文件?,地址,状态,工作,系统,信息,命令,名字,电脑,编辑,文件,linux:命令行中对文件进行编辑后怎么退出到命令行界面1、如果在命