首页 文章

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

提问于
浏览
0

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

我有一个包含3行的example.txt文件 . line1 line2 line3

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"

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

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

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

如果这可以是一个简单的macOS one liner with awk或者其他什么,那很好 . 它不必是sed . 但是,当我搜索这个网站时,似乎是推荐的一个在这个方面 .

2 回答

  • 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
    
  • 0

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

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

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

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

相关问题