如何在没有sed的情况下查找和替换文件中的字符串

How to find and replace string in a file WITHOUT sed

这是我的设置存储库,我在新 linux 安装和公司提供的 mac 书籍中使用。我有这个 makefile 目标:

omz-theme:
    sed -i 's/ZSH_THEME=".*"/ZSH_THEME="$(THEME)"/g' $(HOME)/.zshrc

这在 linux 上工作正常,但在 mac 上会中断,因为它们使用 BSD 的 sed。我需要一些方法来查找和替换 .zshrc 中的文本,无论系统如何,这些文本都会 运行。几乎所有在线资源都只指向 sed。

编辑:这就是它在 mac 上“中断”的方式。如果我执行 brew install gnu-sed 并将目标更改为使用 gsed

,则不会发生
sed: 1: "/Users/username/.zshrc": unterminated substitute pattern

您也可以使用 awk 进行查找和替换。 Here's a resource with more detail..

例如,您的 makefile 命令可以替换为:

omz-theme:
    awk -v var="ZSH_THEME=$(echo THEME)" '{sub(/^ZSH_THEME=.*$/, var); print}' $(HOME)/.zshrc

您可以使用它通过重定向覆盖现有的 $(HOME)/.zshrc 文件:

omz-theme:
    awk -v var="ZSH_THEME=$(echo THEME)" '{sub(/^ZSH_THEME=.*$/, var); print}' $(HOME)/.zshrc > $(HOME)/.zshrc

或者,您可以 check the OS using OSTYPE 然后对 BSD 和 GNU 使用正确的 sed 语法:

omz-theme:
    if [[ "$OSTYPE" == "linux-gnu"* ]]; then 
        sed -i 's/ZSH_THEME=".*"/ZSH_THEME="$(THEME)"/g' $(HOME)/.zshrc
    else
        sed -i '' 's/ZSH_THEME=".*"/ZSH_THEME="$(THEME)"/g' $(HOME)/.zshrc
    fi

(注意:我没有测试上面的内容,但你明白了)