【问题标题】:sed not replacing linessed 不替换行
【发布时间】:2013-01-11 07:20:08
【问题描述】:

我有一个包含 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

但它永远不会更改文件。我已经尝试在反斜杠处将它分布在 2 行中,并使用双引号,但我无法让它在第一行放置 0(或其他任何内容)。

【问题讨论】:

  • 你需要in-place编辑。请参阅-i 标志的手册页。
  • …或者你可以使用ed,我将继续提到它,因为我很坚持,这实际上是ed 的用途。 (与向流编辑器添加非标准扩展名相反,以便它可以写回文件。)
  • sed 对流进行操作并将其输出打印到标准输出。如果你想修改你的输入文件,看看下面我的回答。

标签: bash replace sed


【解决方案1】:

由于这是一个非常简单的文件,sed 实际上可能有点矫枉过正。听起来您希望文件只有一个字符:“0”或“1”。

在这种情况下,只覆盖文件而不是编辑它可能更有意义,例如:

echo "1" > output 

echo "0" > output

【讨论】:

    【解决方案2】:

    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 的方式也不同。

    在某些平台上,您必须指定备份扩展程序(在其他平台上您不必这样做)。

    【讨论】:

    • +1 向权力讲真话。但是,有一个缺少的报价。此外,可以通过提及 ed 和非标准但非常常见的 -i 标志来改进此答案。
    • GNU sed 支持-i 选项;大多数其他版本的sed 没有。
    • @JonathanLeffler BSD 也有这个标志,但它需要扩展。
    • 我为此寻找了如何使用ed,但找不到任何关于如何进行无条件替换的示例。而sed 无处不在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多