Bash sed不更换线路

Bash sed不更换线路,bash,replace,sed,Bash,Replace,Sed,我有一个包含一行文本的文件,名为output。我有文件的写权限。我可以从一个编辑那里毫无问题地修改它 $ cat output 1 $ ls -l o* -rw-rw-r-- 1 jbk jbk 2 Jan 27 18:44 output 我要做的是用一个新值替换这个文件中的第一行(也是唯一的一行),要么是1,要么是0。在我看来,sed应该是完美的: $ sed '1 c\ 0' output 0 $ cat output 1 但它从不改变文件。我尝试过在反斜杠处将其分散在两行上,并使用双

我有一个包含一行文本的文件,名为
output
。我有文件的写权限。我可以从一个编辑那里毫无问题地修改它

$ cat output
1
$ ls -l o*
-rw-rw-r-- 1 jbk jbk 2 Jan 27 18:44 output
我要做的是用一个新值替换这个文件中的第一行(也是唯一的一行),要么是1,要么是0。在我看来,sed应该是完美的:

$ sed '1 c\ 0' output
 0
$ cat output
1

但它从不改变文件。我尝试过在反斜杠处将其分散在两行上,并使用双引号,但我无法让它在第一行中放置0(或其他任何内容)。

Sed对流进行操作,并将其输出打印到标准输出

它不会修改输入文件

当您希望在文件中捕获其输出时,通常会这样使用:

#
# replace every occurrence of foo with bar in input-file
#
sed 's/foo/bar/g' input-file > output-file
上述命令调用
input file
上的
sed
,并将输出重定向到名为
output file
的新文件

根据您的平台,您可能可以使用sed的
-i
选项就地修改文件:

sed -i.bak 's/foo/bar/g' input-file
注:

并非所有版本的sed都支持
-i

此外,不同版本的sed以不同的方式实现
-i


在某些平台上,您必须指定备份扩展名(在其他平台上,您不必指定备份扩展名)。

由于这是一个极其简单的文件,因此sed实际上可能有些过分。听起来您希望文件只有一个字符:“0”或“1”

在这种情况下,只覆盖文件比编辑文件更有意义,例如:

echo "1" > output 


您需要
就地编辑。查看
-i
标志的手册页……或者您可以使用,我将继续提及,因为我是持久的,这实际上是
ed
的目的。(与向流编辑器添加非标准扩展名以便它可以写回文件不同)sed操作流并将其输出输出到标准输出。如果你想修改你的输入文件,请看我下面的答案。+1表示对权力说实话。不过,这里缺少一句话。此外,这个答案可以通过提及和非标准但非常常见的
-i
标志来改进。GNU
sed
支持
-i
选项;大多数其他版本的
sed
都没有。@JonathanLeffler BSD也有该标志,但它需要扩展。我寻找了如何使用
ed
来实现这一点,但找不到任何无条件替换的示例。然而,
sed
到处都是。
echo "0" > output