无法使用SED快速编辑文件

无法使用SED快速编辑文件,sed,Sed,该文件最初是 $cat so/app.yaml application: SO ... 我运行以下命令。我得到一个空文件 $sed s/SO/so/ so/app.yaml > so/app.yaml $cat so/app.yaml $ 如何使用SED编辑文件而不给我一个空文件? $ sed -i -e's/SO/so/' so/app.yaml -i表示就地。我认为将输出重定向到您正在编辑的同一个文件会导致您的问题 您需要将标准输出重定向到某个临时文件,并在sed完成时用临

该文件最初是

$cat so/app.yaml 
application: SO
...
我运行以下命令。我得到一个空文件

$sed s/SO/so/ so/app.yaml > so/app.yaml 
$cat so/app.yaml 
$
如何使用SED编辑文件而不给我一个空文件?

$ sed -i -e's/SO/so/' so/app.yaml

-i
表示就地。

我认为将输出重定向到您正在编辑的同一个文件会导致您的问题


您需要将标准输出重定向到某个临时文件,并在sed完成时用临时文件覆盖原始文件。

管道中使用的
将在管道全部设置好后,即在命令执行之前打开输出文件。因此,输入文件在执行
sed
之前被截断。这是所有shell重定向的问题,而不仅仅是sed的问题


Sheldon Young的回答说明了如何使用就地编辑。

您使用的工具不正确。是一个流编辑器(这就是为什么它被称为s
ed
),因此它用于管道中流的动态编辑。OTOH是一个文件编辑器,它可以做
sed
所能做的一切,除了它可以处理文件而不是流。(实际上,情况正好相反:
ed
是原始实用程序,
sed
是一个克隆,它避免了为流创建临时文件。)

ed
的工作原理非常类似于
sed
(因为
sed
只是一个克隆),但有一个重要区别:您可以在文件中移动,但不能在流中移动。因此,
ed
中的所有命令都采用一个地址参数,该参数告诉
ed
,在文件中应用命令的位置。在您的情况下,您希望在文件中的任何地方应用该命令,因此address参数只是
,因为
a,b
表示“从
a
行到
b
”,
a
的默认值是
1
(文件开头),而
b
的默认值是
$/code>(文件结尾),所以把它们都去掉意味着“从文件开始到文件结束”。然后是
s
(替换),其余看起来很像
sed

因此,您的
sed
命令
s/So/So/
将变成ed命令
,s/So/So/

同样,由于
ed
是一个文件编辑器,更准确地说,是一个交互式文件编辑器,我们还需要编写(
w
)文件并退出(
q
)编辑器

这就是它的整体外观:

ed -- so/app.yaml <<-HERE
    ,s/SO/so/
    w
    q
HERE

ed--so/app.yaml手册页:不建议在就地编辑文件时提供零长度扩展名,因为在磁盘空间耗尽等情况下,您可能会损坏或部分内容。谢谢!在过去的三十分钟里,我一直在努力解决这个问题。如果这对您不起作用:您正在使用的
sed
版本可能不支持
-I
——例如,在Solaris中。在这种情况下,通常会有一个支持它的
gsed
-i
在AIX系统上不受支持。解决方法是将其输出到tmp文件,然后将其复制到您想要修改的文件中。看来杨的方法是唯一的方法。我也尝试了以下代码,但没有成功。
sed s/ABC/ABC/settings.py
>settings.py。我认为@Rob建议使用
将其输出到tmp文件,然后将其复制回来<代码>sed s/ABC/ABC/settings.py>tmp;cp tmp settings.py
如何在不将虚拟文件保留在文件夹中的情况下作为一行程序执行此操作?文件夹“/tmp”用于虚拟文件。所以它可能是这样的:sed s/So/So/app.yaml>/tmp/tmp321;mv-f/tmp/tmp321 so/app.yaml“GNU sed的专有扩展”@Jörg:你的意思是GNU通过出售代码来赚钱吗?我一直有一个想法,任何人都可以免费使用GNU软件,这遵循GNU许可证(即,如果使用GNU代码,您需要为他人免费发布您的代码)。这不是我的意思。英语不是我的第一语言,也许“专有”是个错误的词。我的意思是“-I”仅在GNU sed中可用,并且不是POSIX/SUS标准的一部分,因此GNU可以以任何方式重新定义“-I”,其他供应商可以以任何方式实现“-I”。。。。。。或者根本不实施。除了GNU sed的源代码外,'-i'的含义没有定义。我的大学过去在服务器上使用HP-UX,学生们面临的第一个问题是,他们试图使用诸如“sed-i”或“bash”之类的东西,或者他们从。。。。。。Linux系统和它不起作用,只是因为它们在HP-UX上不存在。