如何在macOS上使用sed用bash脚本替换一行

时间:2017-11-18 21:31:38

标签: bash macos shell sed

我在macOS High Sierra上,我和sed有几个问题, 在谷歌和这个网站上度过了一天后,我老老实实地尝试了我能想到的一切,并提出了建议。

我有一个包含3行的example.txt文件。 一号线 2号线 line3中

3条线可以是任何东西,我不认识它们。 (场景) 在某些时候,我确实知道这条线是什么。

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

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

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

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

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

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

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

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

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

如果这可以是一个简单的macOS一个带有awk或者其他的衬垫,那很好。它不必是sed。但是当我搜索这个网站时,似乎是这个问题的推荐。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

MacOS上带-i的{​​{1}}参数需要备份文件的文件扩展名,例如:

sed

如果您不想要备份文件,请使用:

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