【问题标题】:How to use sed on macOS to replace a line with bash script如何在 macOS 上使用 sed 将一行替换为 bash 脚本
【发布时间】:2018-05-02 10:46:01
【问题描述】:

我使用的是 macOS High Sierra,我在使用 sed 时遇到了一些问题, 在谷歌和这个网站上呆了一天之后,我诚实地尝试了我能想到的一切,并得到了建议。

我有一个包含 3 行的 example.txt 文件。 第1行 线2 第3行

这 3 行可以是任何东西,我不知道它们是什么。 (设想) 在某些时候,我确实知道这条线会是什么。

我希望实现的只是使用“随便”的在线人,基本上说: 在该文件中,将第 2 行替换为新数据。

sed -i "2s/.*/$NEW_DATA/" "$FILENAME"

这应该可以,但在 macOS 上,这不行。

sed -ie "2s/.*/$NEW_DATA/" "$FILENAME"

注意 e?这里有人建议添加一个 e,是的,这有效..但这意味着它在 .txt 后面添加了 e。我最终得到了 2 个文件,example.txt 和 example.txte

sed -i'' "2s/.*/$NEW_DATA/" "$FILENAME"

注意 -i 后面的 '',是的,没有空格?这也应该有效。 它没有,它会抱怨命令 c 需要 \

我可以继续,但请求很简单:

在 macOS 上,在 bash shell 脚本中,我如何简单地将 .txt 文件中的指定文本行替换为全新的文本行——不知道之前的文本行是什么?

如果这可以是带有 awk 或其他东西的简单 macOS one liner,那很好。它不必是 sed。但是当我搜索这个网站时,在这方面它似乎是推荐的。

【问题讨论】:

  • 如果你使用 -i'' -e,行为会改变吗?我一直认为 -e 是隐含的。

标签: bash macos shell sed


【解决方案1】:

来自 macOS 中的sed man 页面:

-i extension
         Edit files in-place, saving backups with the specified extension. 
         If a zero-length extension is given, no backup will be saved. 

因此,这可以用来替换第 2 行而不保留备份:

sed -i '' "2s/.*/$NEW_DATA/" testfile.txt

如果目标只是替换第2行的内容awk也可以使用,例如:

awk 'NR==2{$0="your content"}1' testfile.txt > testfile.tmp && mv testfile.tmp testfile.txt

【讨论】:

  • Just -i 不能在 macOS 上工作,我已经提到过这一点。我试过 -i'' 和 -i ''
  • 除非 sed 在 macOS high sierra 中被修改,否则这应该可以工作,在任何情况下至少 awk 替代工作?你能粘贴错误吗
  • @user8964123 这里的关键是-I''之间必须有一个空格,否则不起作用。不幸的是,GNU sed 不允许它在那里有空格,所以没有办法做到这一点。
猜你喜欢
  • 1970-01-01
  • 2020-09-22
  • 2021-09-12
  • 2021-09-29
  • 2013-07-21
  • 2022-07-21
  • 2017-11-09
  • 2013-08-31
  • 1970-01-01
相关资源
最近更新 更多