1
26
这个 乱劈 下面是一个快速的即兴回答,它起到了作用,并收到了很多赞成票。然后,随着这个问题越来越受欢迎,时间越来越长,愤怒的人们开始报告说这个问题有点奏效,但可能会发生一些奇怪的事情,或者它根本不起作用,所以有一段时间它被猛烈地否决了。如此有趣。 该解决方案充分利用了系统上文件描述符的精确实现,由于实现在nixes之间的差异很大,因此它的成功完全依赖于系统,最终是不可移植的,不应该依赖于任何甚至是模糊的重要内容。 现在,所有这些都不可能,答案是:
为文件创建另一个文件描述符(
以变量的形式将预付款传递给awk(
|
2
93
这仍然使用一个临时文件,但至少在一行上:
|
3
28
|
4
20
John Mee:您的方法不一定能工作,如果您预先准备了4096字节以上的内容,那么它可能会失败(至少GNUawk会发生这种情况,但我认为其他实现也会有类似的约束)。在这种情况下,它不仅会失败,而且会进入一个无休止的循环,在那里它会读取自己的输出,从而使文件增长,直到所有可用空间都被填满。 自己试试:
(警告:过一会儿将其杀死,否则将填充文件系统) 此外,以这种方式编辑文件是非常危险的,这是非常糟糕的建议,就好像在编辑文件时发生了什么事情(崩溃、磁盘已满),您几乎可以保证文件处于不一致的状态。 |
5
15
没有临时文件是不可能的,但这里有一个OneLiner
您可以使用其他工具(如ed或perl)在不使用临时文件的情况下执行此操作。 |
6
15
|
7
13
如果您在控制的计算机上需要这个,请安装“moreutils”包并使用“sponce”。然后你可以做:
|
8
11
使用bash-heredoc可以避免需要tmp文件:
这是因为在执行带有重定向的cat之前,当对bash脚本进行评估时,会对$(cat myfile)进行评估。 |
9
9
假设要编辑的文件是my.txt
你要准备的文件是头文件
确保头文件中有最后一行空白。
你结束了
据我所知,这只适用于“bash”。 |
10
9
当您开始尝试在shell脚本中做一些变得困难的事情时,我强烈建议您考虑用“合适的”脚本语言(python/perl/ruby/etc)重写脚本。
至于在文件中预先准备一行,则不可能通过管道来完成,就像在执行类似的操作时一样。
可能有一种方法可以通过awk或类似的方法来完成,但是如果必须使用shell脚本,我认为临时文件是迄今为止最简单的(/only?)方式… |
11
8
编辑:这个坏了。见 Weird behavior when prepending to a file with cat and tee
解决覆盖问题的方法是使用
|
12
7
就像丹尼尔·维尔科夫建议的那样,使用T恤。
|
13
3
我用的那个。这一个允许您以您喜欢的方式指定顺序、额外字符等:
只有当文件包含反斜杠的文本时,它才不起作用,因为它被解释为转义字符。 |
14
3
主要是为了好玩/玩空壳高尔夫,但是
这样就可以了,而且没有管道或重定向。当然,vi/ex并不是真正的非交互使用,所以vi将短暂地更新。 |
15
2
为什么不简单地使用ed命令(如这里的fluffle所建议的那样)? Ed将整个文件读取到内存中,并自动执行就地文件编辑! 所以,如果你的文件不是那么大…
另一个解决方法是使用jrgen htzel在 Redirect output from sed 's/c/d/' myFile to myFile
当然,所有这些都可以放在一条线上。 |
16
2
cb0解决方案的一个变体,用于“无临时文件”以预先处理固定文本:
同样,这依赖于子shell执行(..)来避免cat拒绝输入和输出相同的文件。 注意:喜欢这个解决方案。但是,在我的Mac中,原始文件丢失了(认为不应该,但确实如此)。可以通过将解决方案编写为: echo“text to prepend”cat-file_to_u be modified_cat>tmp_file;mv tmp_file_u to_u be_modified |
17
2
以下是我发现的:
|
18
2
|
19
2
警告:这需要更多的工作来满足操作的需要。
有一种方法可以让@shixilun的SED方法发挥作用,尽管他有疑虑。在将文件读取到SED替换字符串(例如,用'\n'替换换行符)时,必须有bash命令来转义空白。外壳命令
失败的原因是替换脚本中的原始换行符,需要在换行符前面加上一个换行符(),然后可能加上一个&来保持shell和sed的快乐,例如 this SO answer
|
20
1
|
21
1
用 $(命令) 可以将命令的输出写入变量。 所以我在一行中用了三个命令,没有临时文件。
|
22
1
如果您有一个大文件(在我的例子中是几百千字节)并且可以访问python,那么这比
|
23
1
解决方案
你也可以这样做:
但在这种情况下,你必须确保没有
|
24
1
您可以使用perl命令行:
其中-i将创建文件的内联替换,并 -0777将删除整个文件,使^仅匹配开头。 -PE将打印所有行 或者如果我的头是一个文件:
其中/e允许在替换中对代码进行eval。 |
25
0
其中,“我的_文件”是要在“我的_字符串”之前添加的文件。 |
26
0
我喜欢 @fluffle's ed approach 最好的。毕竟,任何工具的命令行开关和脚本编辑器命令在这里基本上都是相同的;没有看到脚本编辑器解决方案的“清洁度”有任何下降或下降。
这是我的一行附加到
例子
我正在做
关于经历这件事,我 discovered 对于vim buffs来说,最好有:
|
27
0
变量,FTW?
|
28
0
我认为这是Ed最清晰的变化:
作为一个函数:
|
29
0
如果您是在bash中编写脚本,实际上,您可以发布: cat - yourfile /tmp/out && mv /tmp/out yourfile 这实际上是你在自己的问题中发布的一个复杂的例子。 |
30
0
imho没有一个shell解决方案(而且永远不会是这样的解决方案),无论两个文件的大小如何,它都能始终如一地可靠地工作。
您正在寻找的“真正的”解决方案需要处理文件系统,因此它在用户空间中不可用,并且依赖于平台:您要求修改使用中的文件系统指针
不过,您可以使用循环设备或多或少地伪造这个。例如,请参见 this SO thread . |
lonix · 使用sed从JSON中提取非贪婪正则表达式 1 年前 |
g00dds · 如何在bash中从文件中的每一行解码base64? 2 年前 |
Paul · Bash wait命令忽略指定的进程ID 2 年前 |
RafaÅ G. · 如何使用从文件读取的多行参数运行ssh? 2 年前 |
Priya · 在shell脚本中多次运行python脚本 2 年前 |