我在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。但是当我搜索这个网站时,似乎是这个问题的推荐。
答案 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"