【问题标题】:How to replace string in a file in place using `sed`? [duplicate]如何使用`sed`替换文件中的字符串? [复制]
【发布时间】:2015-11-07 09:47:33
【问题描述】:

我想使用sed 替换一个字符串。我尝试了两种方法:

sed -i 's/string_catcher/new_string/g' <file_name>

这会导致错误,因为它没有正确处理参数。 This是我的信息来源。

然后,我想我可以改为写入文件:

sed 's/string_catcher/new_string/g' <file_name> > <file_name>

作为一种解决方法,我考虑将其写入新文件并通过覆盖将其复制回旧文件。但这不会工作,因为文件很大。在vim中打开需要几分钟。

但是,这会导致文件为空。为什么这些没有工作?解决方案?谢谢。

我使用的是 OSX Darwin Kernel 14.4。

【问题讨论】:

  • 什么操作系统? -i 选项在 Linux 和 OSX 上的工作方式不同。
  • 哦,真的....我在 osx 上
  • 请参阅stackoverflow.com/questions/7573368/… 了解如何在 osx 中解决它。基本上,使用sed -i.backup ...

标签: regex bash sed


【解决方案1】:

-i 选项在 Linux 和 OSX 上有不同的语法。

如果您希望sed 修改原始文件而不在 Linux 上制作备份副本,则不要向 -i 提供任何参数:

sed -i 's/string_catcher/new_string/g'  <file_name>

在 OSX 上,您必须提供一个空字符串作为 -i 的参数:

sed -i '' 's/string_catcher/new_string/g'  <file_name>

【讨论】:

  • 只需将问题标记为duplicate 并继续。一遍又一遍地回答同一个问题是没有意义的。 (虽然很好的答案)
  • @FredrikPihl Makes no sense of answering the same question over and over again,哈哈,你看过这个网站吗?
【解决方案2】:

在您的链接上,您可以找到不使用 -i 选项的“解决方法”。 您只需要使用临时文件即可使其正常工作。不要在 sed 命令期间覆盖现有文件:

sed 's/string_catcher/new_string/g' file_name > file_name_2 && mv file_name_2 file_name

当 string_catcher 或 new_string 包含特殊字符时(或者当你想插入一个 shell 变量时),你应该做更多的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2023-03-20
    • 2020-01-30
    • 2011-08-10
    • 2017-11-14
    • 1970-01-01
    • 2021-03-01
    相关资源
    最近更新 更多