【问题标题】:Add a new line of text at the top of a file in bash shell [duplicate]在 bash shell 中的文件顶部添加新的一行文本 [重复]
【发布时间】:2018-09-21 13:19:47
【问题描述】:

我想写一个 bash 脚本来接收我的文件:

READ_ME.MD

two
three
four

并且成功了

READ_ME.MD

one
two
three
four

有一堆类似的 StackOverflow 问题,但我尝试了他们的答案并没有成功。

这些是我尝试过但失败的 bash 脚本:


test.sh

sed '1s/^/one/' READ_ME.md > READ_ME.md

结果:清除我的文件的内容


test.sh

sed '1,1s/^/insert this /' READ_ME.md > READ_ME.md

结果:清除我的文件的内容


test.sh

sed -i '1s/^/one\n/' READ_ME.md

结果:sed: 1: "READ_ME.md": 无效命令代码 R


任何帮助将不胜感激。

【问题讨论】:

  • 你可以写信给READ_ME.md.tmp,然后写mv READ_ME.md.tmp READ_ME.md。或使用cat READ_ME.md | sed ... > READ_ME.md。问题是你在文件被读取之前截断了它。
  • 使用 >> 附加到文件中。 > 将覆盖它。

标签: bash shell


【解决方案1】:

你可以使用这个BSD sed 命令:

sed -i '' '1i\
one
' file

-i 会将更改内联保存到file


如果你想在顶部添加一行,如果同一行还没有,那么使用BSD sed 命令:

line='one'

sed -i '' '1{/'"$line"'/!i\
'"$line"'
}' file

【讨论】:

  • 如果我不想保存备份,是否可以省略 .bak 扩展名?
  • @anubhave 不修改文件。它只是打印结果。
  • 无需担心它是否存在。如果我在 macOS 上使用终端使用 sed -i,它不起作用。 sed: 1: "READ_ME.md": invalid command code R
  • 你应该早点告诉 OSX :)。在 OSX 上使用:sed -i '' 忽略`备份文件。
  • 我做到了。谢谢!
【解决方案2】:

您的最后一个示例适用于 GNU sed。根据您添加的错误消息,我猜您正在使用 Mac 系统?根据this blog postsed 的 Mac 版本可能需要后缀参数:

sed -i ' ' '1s/^one\n/' READ_ME.md

【讨论】:

  • -i"" 完全-i 相同——sed 无法区分它们,因为它们生成相同的 C 字符串数组解析后,调用程序的实际操作系统级接口是execve 系统调用,它只接受这样的数组(并且不接收或以其他方式完全访问原始命令行)。因此,绝对必须-i '',带有空格,才能传递一个空字符串。
  • 好点,我没有考虑过。已编辑。谢谢,查尔斯!
  • -i ' ' -> 带空格
【解决方案3】:

如果这是 bash 或 zsh,您可以像这样使用进程替换。

% cat x
one
two 
three

% cat <(echo "zero") x
zero
one
two 
three

将其重定向到临时文件并将其复制回原始文件

【讨论】:

    【解决方案4】:

    总是有ed

    printf '%s\n' H 1i "one" . w | ed -s READ_ME.MD
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 2014-04-04
      • 2014-04-08
      • 2017-05-31
      • 2015-09-26
      • 2014-02-27
      • 1970-01-01
      相关资源
      最近更新 更多